我有以下代码段:
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
之间的行为为何不同?
答案 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))