我正在尝试使用带有while read
的数组,但整个数组是一次输出的。
#!/bin/bash
declare -a arr=('1:one' '2:two' '3:three');
while read -e it ; do
echo $it
done <<< ${arr[@]}
它应该单独输出每个值(但不输出),所以也许在阅读时不是这里的热门票?
对于这种情况,使用for
循环会更容易:
$ declare -a arr=('1:one' '2:two' '3:three')
$ for it in "${arr[@]}"; do echo $it; done
1:one
2:two
3:three
while read
方法非常有用:(a) 当您要从文件中读取数据时,以及 (b) 当您想要读取 NUL 或换行符分隔的字符串时。 但是,在您的情况下,您已经在bash
变量中拥有数据,并且for
循环更简单。
可能通过 while 循环
#!/bin/bash
declare -a arr=('1:one' '2:two' '3:three');
len=${#arr[@]}
i=0
while [ $i -lt $len ]; do
echo "${arr[$i]}"
let i++
done
使用下面的 Bash 脚本,您应该实现您想要的。
#!/bin/bash
# Ensure fail-fast script execution.
shopt -os nounset pipefail errexit errtrace
declare -a arr=('1:one' '2:two' '3:three');
while read -r it; do
echo "${it}"
done < <(printf '%sn' "${arr[@]}")
这里有几点需要注意:
- 通常,您应该通过使用
shopt -os
设置适当的 shell 选项来使所有脚本快速失败。
不需要 - Readline 将每一行(数组元素)读入变量
it
,因为在脚本运行时您不会与终端交互。 - 相反,通常最好通过传递其
-r
选项来防止解释任何反斜杠转义字符read
。 - 应始终用双引号将变量引用括起来,并将变量名称放在一对大括号内。如果变量被扩展并且其值包含空格,引用可以防止各种错误。另一方面,大括号通过将变量名称与美元符号(以及展开为内插字符串时周围的文本)分开来促进可读性。
printf '%sn'
语句在新行上打印每个数组元素。然后,printf
产生的输出通过标准输入流直接馈送到while循环中。