Bash
for循環不適用於多行
我有一個像“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/w
1.
和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 循環。