bash脚本抱怨文件名太长

Jer*_*ore 1 bash json

所以我有一个脚本可以做到这一点(jq是命令行JSON处理器):

echo "Getting LB Node IDs"
echo $LB_STATUS | jq '.loadBalancer.nodes[] .id'
Run Code Online (Sandbox Code Playgroud)

最后一行的输出是:

1
2
3
Run Code Online (Sandbox Code Playgroud)

但是当我尝试将其分配给数组时:

echo "Creating an Array"
nodeIdArray=($($LB_STATUS | jq '.loadBalancer.nodes[] .id'))
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

./myShellScript.sh: line 53: {"loadBalancer":{"name":"lbName","id":1,"protocol":"HTTP","port":80,"algorithm":"WEIGHTED_LEAST_CONNECTIONS","status":"ACTIVE","cluster":{"name":"ztm-n22.dfw1.lbaas.rackspace.net"},"nodes":[{"address":"1.2.3.4","id":1,"type":"PRIMARY","port":80,"status":"ONLINE","condition":"ENABLED","weight":1},{"address":"1.2.3.4","id":2,"type":"PRIMARY","port":80,"status":"ONLINE","condition":"ENABLED","weight":1},{"address":"1.2.3.4","id":3,"type":"PRIMARY","port":80,"status":"ONLINE","condition":"ENABLED","weight":1}],"timeout":30,"created":{"time":"2016-06-28T22:14:24Z"},"healthMonitor":{"type":"CONNECT","delay":10,"timeout":5,"attemptsBeforeDeactivation":2},"sslTermination":...<A BOAT LOAD MORE JSON I CUT OUT FOR BREVITY'S SAKE>: File name too long
Run Code Online (Sandbox Code Playgroud)

因此$ LB_STATUS | jq'.loadBalancer.nodes [] .id'产生一些数字,同时尝试将这些数字分配给数组不起作用

Cha*_*ffy 6

什么地方出了错

$variable | something不会将文本variable作为输入传递给something-而是$variable 将命令的内容作为命令运行。大概是您想要的echo "$variable" | something(但请参见下文!)

即使是固定的,这个array=( $(some-command) )习惯用法本身也是错误的。请参阅BashPitfalls#50,其中描述了为什么不应该使用它以及各种替代方法。

该怎么做

当供给从可变内容作为输入到一个命令,它是惯用使用herestring: somecommand <<<"$variable"。这些不是免费的(因为它们创建临时文件),但是它们比管道(分叉子外壳)便宜。

如果您使用的是bash 4.x或更高版本,则可以readarray

readarray -t nodeIdArray < <(jq -r '.loadBalancer.nodes[].id' <<<"$LB_STATUS")
Run Code Online (Sandbox Code Playgroud)

如果需要与bash 3.x兼容,read -a可以执行以下操作:

IFS=$'\n' read -r -d '' -a nodeIdArray \
  < <(jq -r '.loadBalancer.nodes[].id' <<<"$LB_STATUS" && printf '\0')
Run Code Online (Sandbox Code Playgroud)

...这还具有以下优点:read如果jq命令失败,将导致返回非零退出状态。


Jac*_*ack 5

你遗漏了echo.

改变

nodeIdArray=($($LB_STATUS | jq '.loadBalancer.nodes[] .id'))
Run Code Online (Sandbox Code Playgroud)

nodeIdArray=($( echo $LB_STATUS | jq '.loadBalancer.nodes[] .id' ))
Run Code Online (Sandbox Code Playgroud)