【发布时间】:2018-04-23 06:42:12
【问题描述】:
考虑这个例子,比如说test.sh:
cat > test.txt <<'EOF'
test 1
test 2
test 3
EOF
declare -a myarr
declare -p myarr # "declare: myarr: not found"
myarr=()
declare -p myarr # "declare -a myarr='()'"
#for (( i=1; i<=3; i++ )); do # ok
sed -n 's!test!TEST!p' test.txt | while read i; do # not preserved ?!
myarr=("${myarr[@]}" "pass $i")
declare -p myarr
done
declare -p myarr # "declare -a myarr='()'" ?!
如果我取消注释for ((... 行,并注释sed -n ... 行,那么bash test.sh 的输出与预期一致:
test.sh: line 8: declare: myarr: not found
declare -a myarr='()'
declare -a myarr='([0]="pass 1")'
declare -a myarr='([0]="pass 1" [1]="pass 2")'
declare -a myarr='([0]="pass 1" [1]="pass 2" [2]="pass 3")'
declare -a myarr='([0]="pass 1" [1]="pass 2" [2]="pass 3")'
但是,如果我按照发布的方式运行脚本,则 myarr 会在 while 循环中构建,但一旦在外部,它就是空的:
test.sh: line 8: declare: myarr: not found
declare -a myarr='()'
declare -a myarr='([0]="pass TEST 1")'
declare -a myarr='([0]="pass TEST 1" [1]="pass TEST 2")'
declare -a myarr='([0]="pass TEST 1" [1]="pass TEST 2" [2]="pass TEST 3")'
declare -a myarr='()'
那么,为什么myarr 在这种情况下(在while 循环之后)是空的 - 我如何让它保持其价值?
【问题讨论】:
-
这是BashFAQ #24。