forループは複数行では機能しません

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が印刷されず、長い間隔の白黒で印刷されるのかわかりませ1.Apple

答え1

問題は配列です。要素が1つだけの配列を作成したようです。次の例を試してください。

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

実際には、1つの要素を含む配列を作成するのがわかります。 3番目のループは、シェルが文字列でフィールド分割を実行してApple\nBanana\nClementine\nDate4つの別々の単語を提供するため、4つの要素を印刷します。

配列を次のように変更する場合:

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ループを使用する必要があります。

答え2

これがあなたに必要なものです:

[sreeraj@server ~]$ fruits=(Apple Banana Clementine Date)
[sreeraj@server ~]$ (IFS=$'\n'; echo "${fruits[*]}") | nl
     1  Apple
     2  Banana
     3  Clementine
     4  Date
[sreeraj@server ~]$

関連情報