我有一个像这样的数组“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 ~]$