Bash脚本未追加

Bash脚本未追加,bash,Bash,我想用以下bash脚本生成一个单词列表,但append不起作用: declare -a NODES=() cat $1 | while read line;do for word in $line; do NODES+=("$word") echo $word done done echo "Nodes: ${NODES[@]}" 我得到输出: node01 node02 node03 node04 Nodes: 要运行脚本,请执行以下

我想用以下bash脚本生成一个单词列表,但append不起作用:

declare -a NODES=()
cat $1 | while read line;do
    for word in $line; do
       NODES+=("$word")
       echo $word
    done
done

echo "Nodes: ${NODES[@]}"
我得到输出:

 node01
 node02
 node03
 node04
 Nodes:
要运行脚本,请执行以下操作:

 $ bash myscript.sh nodes_list
节点列表文件: 节点01 节点02 节点03
node04

您被一个与管道相关的经典问题所困扰-管道的每一侧都在其自己的子shell中执行,因此您使用的数组超出范围,其内容在循环后消失

您的问题可以简单地解决(并且您也不再无用地使用
cat
):

nodes=()#这里不需要使用declare,使用小写变量名
而read-r行;do#-r开关几乎总是您想要的
对于$line中的单词;做
节点+=(“$word”)
echo“$word”#始终引用您的变量!
完成
完成<“$1”#使用重定向而不是管道来避免创建子shell
echo“节点:${Nodes[@]}”

考虑到您的用例和问题,Tom Fenech的回答很好,但是您也可以使用IFS创建一个数组:

#!/bin/bash
declare nodes=( $(<"$1") )

for (( i = 0; i < ${#nodes[@]}; ++i )); do
  echo "line: ${i}: ${nodes[$i]}"
done
如果需要按行分割(例如:获取包含每行的数组),可以执行以下操作:

OIFS=$IFS
IFS=$'\n'
declare nodes=( $(<"$1") )
IFS=$OIFS
OIFS=$IFS
IFS=$'\n'

declare nodes=($)(这是您的输入。它也不起作用,因为您正在子shell中赋值,我会找到一个重复的节点,但我真的不介意。在读取blah;do blah;done
$ ./toto.bash toto.bash
line: 0: #!/bin/bash
line: 1: declare
line: 2: nodes=(
line: 3: $(<"$1")
line: 4: )
line: 5: for
line: 6: ((
line: 7: i
line: 8: =
line: 9: 0;
line: 10: i
line: 11: <
line: 12: ${#nodes[@]};
line: 13: ++i
line: 14: ));
line: 15: do
line: 16: echo
line: 17: "line:
line: 18: ${i}:
line: 19: ${nodes[$i]}"
line: 20: done
OIFS=$IFS
IFS=$'\n'
declare nodes=( $(<"$1") )
IFS=$OIFS