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

问题是你的数组。看来您创建了一个只有一个元素的数组。试试这个例子:

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 循环。

答案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 ~]$

相关内容