引用变量上的猫失败

时间:2018-08-16 16:39:11

标签: bash

我有以下代码段:

userjobs=$(grep -rw "$USER" /my/job/dir/|awk '{print $1}'|sort|uniq|rev|cut -c 2-|rev)
for job in "${userjobs[@]}"; do
  cat "$job"
done
exit 0

按原样运行时,得到以下输出:

cat: /my/job/dir/45
/my/job/dir/46: No such file or directory

但是,如果我取消对$ job的引用,我将不再收到此行为,并且按预期处理了每个文件。

我已经阅读了一些有关遍历和拆分的内容,以查看是否发生了这种情况,但是似乎双引号可以防止这种情况的发生。谁能解释"$job"$job之间的行为为何不同?

2 个答案:

答案 0 :(得分:3)

发生这种情况是因为您的变量如下所示:

userjobs='/my/job/dir/45
/my/job/dir/46'

如果使用"${userjobs[@]}"将其扩展为数组,则它将作为仅包含一个元素(即字符串)的数组。因此,行为与以下内容相同:

userjobs=( [0]='/my/job/dir/45
/my/job/dir/46' )

...仍然只是一个字符串,其中包含文字换行符。

因此,cat "$job"查找名称中带有文字换行符的文件。


要将结果加载到真实数组中,可以使用"${userjobs[@]}"进行迭代以扩展到每行一个不同的元素,请使用:

readarray -t userjobs < <(grep ...)

答案 1 :(得分:0)

userjobs必须是一个数组。赋值时,在值两边加上括号:

userjobs=($(grep -rw "$USER" /my/job/dir/|awk '{print $1}'|sort|uniq|rev|cut -c 2-|rev))