Bash

for循環不適用於多行

  • November 29, 2014

我有一個像“Apple Banana Clementine Date”這樣的數組

我必須這樣列印:

1. Apple
2. Banana
3. Clementine
4. Date

腳本文件:

for i in "${fruits[@]}"; do
   echo "$lineno. $i "
   lineno+=1
done

myscript的輸出:

1.             Apple
              Banana
              Clem....

我不明白為什麼它不列印 lineno 以及為什麼它列印 long gap b/w1.Apple. 謝謝。

問題是你的數組。您似乎創建了一個只有一個元素的數組。試試這個例子:

array=("$(printf 'Apple\nBanana\nClementine\nDate')")

for ((i = 0; i < ${#array[@]}; i++)); do
 printf '%d. %s\n' $((i+1)) "${array[$i]}"
done

j=0
for e in "${array[@]}"; do
 j=$((j+1))
 printf '%d. %s\n' "$j" "$e"
done

k=0
for e in ${array[@]}; do
 k=$((k+1))
 printf '%d. %s\n' "$k" "$e"
done

然後執行:

$ ./test.sh 
1. Apple
Banana
Clementine
Date
1. Apple
Banana
Clementine
Date
1. Apple
2. Banana
3. Clementine
4. Date

你可以看到,你實際上創建了一個包含一個元素的數組。第三個循環列印四個元素,因為 shell 已經對 string 執行了欄位拆分Apple\nBanana\nClementine\nDate,這給了你四個分開的單詞。

如果將數組更改為:

set -f
array=( $(printf 'Apple\nBanana\nClementine\nDate') )
set +f

set -f禁用萬用字元擴展,以防字元*?\[出現在命令的輸出中)您將獲得所需的結果,即命令的輸出在空格處拆分:

$ ./test.sh 
1. Apple
2. Banana
3. Clementine
4. Date
1. Apple
2. Banana
3. Clementine
4. Date
1. Apple
2. Banana
3. Clementine
4. Date

請注意,"${array[@]}"當您想要遍歷所有數組元素時必須使用雙引號,或者像我的第一個範例一樣使用 c 樣式的 for 循環。

引用自:https://unix.stackexchange.com/questions/170407