如何使用一些自定义格式以编程方式处理 bash 函数中的空输出

how to programmatically handle null output within a bash function with some custom formatting

我有一个 bash 函数,它使用 result 中的 IP 列表,对于每个 IP,它用作对 return 字符串的数据库查询的一部分。我现在需要帮助的是如何处理输出,如果 IP 没有 return 数据(参见测试输出)

代码:

set -x
demo() {
        local result='10.8.3.34
        10.8.2.191
        10.8.3.54
        10.8.4.150
        10.8.3.249
        10.8.2.197'
        read -d '' -a servers <<< $result
        echo "Checking ${#servers[@]} servers";
        for i in ${servers[@]};
        do
          local host='10.1.2.130'
          local db='myapplication_cluster_state'
          _mongo=$(which mongo);
          echo -n "$i:";
          local exp="db.myapplicationcluster_servers.find(
          {\"node_host\":\"${i}\",\"node_type\":\"APP_PROCESS\",\"region\":\"us-east-1\",\"status\":\"ACTIVE\"},{\"partition_range_start\":1,\"partition_range_end\":1, _id:0}).pretty();";
          ${_mongo} ${host}/${db} --eval "$exp" | grep -o -e "{[^}]*}";
        done
}
set +x
demo

我的测试输出

+ set +x
Checking 6 servers
10.8.3.34:{ "partition_range_start" : 31, "partition_range_end" : 31 }
10.8.2.191:{ "partition_range_start" : 79, "partition_range_end" : 79 }
10.8.3.54:{ "partition_range_start" : 62, "partition_range_end" : 62 }
10.8.4.150:{ "partition_range_start" : 22, "partition_range_end" : 22 }
10.8.3.249:10.8.2.197:{ "partition_range_start" : 16, "partition_range_end" : 16 }

注意:10.8.3.249没有数据,所以下一个字符串附加为10.8.3.249:10.8.2.197:{ "partition_range_start"

我希望输出格式是这样的:

+ set +x
Checking 6 servers
10.8.3.34:{ "partition_range_start" : 31, "partition_range_end" : 31 }
10.8.2.191:{ "partition_range_start" : 79, "partition_range_end" : 79 }
10.8.3.54:{ "partition_range_start" : 62, "partition_range_end" : 62 }
10.8.4.150:{ "partition_range_start" : 22, "partition_range_end" : 22 }
10.8.3.249:
10.8.2.197:{ "partition_range_start" : 16, "partition_range_end" : 16 }

OR 如果读取的 IP 没有数据,输入一些值,即 EMPTY

10.8.3.34:{ "partition_range_start" : 31, "partition_range_end" : 31 }
10.8.2.191:{ "partition_range_start" : 79, "partition_range_end" : 79 }
10.8.3.54:{ "partition_range_start" : 62, "partition_range_end" : 62 }
10.8.4.150:{ "partition_range_start" : 22, "partition_range_end" : 22 }
10.8.3.249: EMPTY
10.8.2.197:{ "partition_range_start" : 16, "partition_range_end" : 16 }

我怎样才能实现这个输出?谢谢。

将您的 for 循环更改为...

for i in ${servers[@]}
do
  local host='10.1.2.130'
  local db='myapplication_cluster_state'
  _mongo=$(which mongo)
  local exp="db.myapplicationcluster_servers.find({\"node_host\":\"${i}\",\"node_type\":\"APP_PROCESS\",\"region\":\"us-east-1\",\"status\":\"ACTIVE\"},{\"partition_range_start\":1,\"partition_range_end\":1, _id:0}).pretty();"

  # Store output of mongo command in variable
  output=$(${_mongo} ${host}/${db} --eval "$exp" | grep -o -e "{[^}]*}")

  # Print {} if output variable is empty
  echo "${i}:${output:-{}}"
done

要空着切换 {},请使用 echo "${i}:${output:-}"

要将 {} 切换为 EMPTY,请使用 echo "${i}:${output:- EMPTY}"

正在排序

要对 partition_range_start 的值进行排序,将 demo 函数的输出通过管道传递给 sort 命令...

demo | sort -n -k4

这表示 "sort the output of demo numerically (-n) on field 4 (-k4)"。默认情况下,字段是由空格分隔的字符。

这是 sort 看到的行 10.8.3.34:{ "partition_range_start" : 31, "partition_range_end" : 31 }...

  • 字段 1 10.8.3.34:{
  • 字段 2 "partition_range_start"
  • 字段 3 :
  • 字段 4 31,
  • 字段 5 "partition_range_end"
  • 字段 6 :
  • 字段 7 31
  • 字段 8 }