【问题标题】:why is [ for i in ${ARR[@]}; do echo ${i} ] printing space-delimited output? [duplicate]为什么是 [ for i in ${ARR[@]}; echo ${i} ] 打印以空格分隔的输出吗? [复制]
【发布时间】:2017-12-31 07:21:16
【问题描述】:

我已使用以下方法从文件中读取输入:

declare -a ARR      
    readarray -t ARR < <(cat /etc/passwd | tr "\n" "\n" )

这打印得很好,但我想访问每一行:

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

这是在空格上分割输入:

for i in ${ARR[@]}; do
        echo ${i}
    done

echo 是否需要特定选项才能正确打印? 基于this answer,将其更改为echo "${i}" 应该可以修复它,但事实并非如此。 这有同样的问题:

printf "${i} \n"

【问题讨论】:

  • tr "\n" "\n" 应该达到什么目的?

标签: bash


【解决方案1】:

为避免在空格上拆分,请替换:

for i in ${ARR[@]}; do

与:

for i in "${ARR[@]}"; do

没有双引号,shell 会进行分词。

最好将echo ${i} 替换为echo "${i}"。如果没有双引号,${i} 将受到分词(这将导致多个空格折叠为一个空白)和 路径名扩展(这可能导致带有 shell 活动字符的单词替换为当前目录中的文件名)。

【讨论】:

  • 大多数变量/数组/命令扩展应该用双引号括起来。在某些情况下,不使用双引号是安全的,但 IMO 更麻烦的是跟踪它的安全位置,而不是始终使用双引号。
  • 请注意,在双引号内,"${ARR[*]}" 使用$IFS 的第一个字符作为分隔符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 2021-12-14
  • 1970-01-01
相关资源
最近更新 更多