如何在bash中打印数组中的字符串?

29 浏览
0 Comments

如何在bash中打印数组中的字符串?

给定以下数组:

arr=("hello hello" "bye bye")

如何将arr中的任何元素打印到标准输出?

我尝试以以下方式实现:

for line in ${arr[*]}; do
    echo ${line}
done

但是在这种情况下,输出是:

hello

hello

bye

bye

而我想要的是:

hello hello

bye bye

0
0 Comments

问题的原因是bash会尽力解释代码,但在这种情况下解释有一些问题。解决方法是将代码修改为:

arr=("hello hello" "bye bye")
for line in "${arr[@]}" ; do
    echo $line
done

在这个解决方法中,使用了`"${arr[@]}"`来打印数组中的字符串。与此相比,`arr[*]`会将整个数组视为一个字符串,并打印整个字符串。

0
0 Comments

问题的出现原因是没有对字符串进行引用,导致出现了shell word splitting的问题。解决方法是对字符串进行引用,可以使用双引号或者printf函数。

具体的解决方法如下:

1. 使用双引号对字符串进行引用:

$ for line in "${arr[@]}"; do echo "$line"; done

2. 使用printf函数对字符串进行引用:

$ printf '%s\n' "${arr[@]}"

输出结果为:

hello hello
bye bye

另外,还提到了在包含空格或特殊字符的字面量和每个扩展中都应该使用双引号进行引用,例如:`"$var"`, `$(command "$var")`, `${array[@]}`, `a & b`。对于代码或字面量中的变量,可以使用单引号进行引用,例如:`'Costs $5 US'`, `ssh host 'echo "$HOSTNAME"'`。

还介绍了`$@`和`$*`之间的区别,`"$@"`会将每个位置参数扩展为它自己的参数,而`"$*"`会将所有位置参数扩展为单个参数。未引用的`$@`和`$*`是未定义的,不应使用。对于数组,也是同样的情况,应该使用`"${array[@]}"`。

最后,提供了一些相关链接供进一步了解。

解决了问题后,还有其他问题需要帮助。

0