2
簡單變量測試:變量復位
#!/bin/bash
N=0
ls -l | while read L; do
N=$((N+1))
echo $N
done
echo "total $N"
運行它然後輸出:
1
2
3
total 0
我預期的最終N = 3: 「總3」,但爲什麼值循環後重置爲0?
簡單變量測試:變量復位
#!/bin/bash
N=0
ls -l | while read L; do
N=$((N+1))
echo $N
done
echo "total $N"
運行它然後輸出:
1
2
3
total 0
我預期的最終N = 3: 「總3」,但爲什麼值循環後重置爲0?
bash
在其自己的子shell中的管道中運行每個語句。 (對於外部命令,例如ls
,subshell只是exec
的命令。)這有效地使所有變量都是本地的。您通常必須通過使用重定向或命令替換而不是管道來解決此問題。
編輯:這似乎工作:
#!/bin/bash
IFS=
N=0
while read L; do
N=$((N+1))
echo $N
done <<<$(ls -l)
echo "total $N"
pipe,subshell和解決方法。 gotcha,thx! – sof
解決爲已知的子shell的問題。 check out http://stackoverflow.com/questions/5006229/why-does-my-bash-counter-reset-after-while-loop – sof
你可以用((N ++))替換$((N + 1)))具有相同的結果 – ata