「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\nDate
4つの別々の単語を提供するため、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 ~]$