如何将 shell 命令输出到变量中?

如何将 shell 命令输出到变量中?

我正在尝试编写一个简单的脚本:

stat=$(du /home/test/)
for i in "$stat"; do
folder=$("$i" | awk '{print $2}')
mail -s $folder [email protected]
done

我在 shell 中运行脚本,输出如下:

4       /home/test/.config/mc/mcedit
12      /home/test/.config/mc
16      /home/test/.config

然后,我在循环之前的脚本中插入 echo,输出如下所示:

4 /home/test/.config/mc/mcedit 12 /home/test/.config/mc 16 /home/test/.config

这是因为没有双引号。带双引号的输出与 shell 中的输出相同。因此,在循环变量 $folder 中对变量使用双引号不能按预期工作。相反,它包含列表中的所有值。

如何解决这个问题?

答案1

这是一种实现您所期望的方法,尽管不是使用循环for而是使用while循环:

stat=$(du /home/test/)
echo "$stat" | while read i; do
    folder=$(echo "$i" | awk '{print $2}')
    echo "mail content" | mail -s $folder [email protected]
done

当然,正如 Archemar 已经评论的那样,没有理由不将输出直接通过管道du传输到循环:

du /home/test/ | while read i; do
    folder=$(echo "$i" | awk '{print $2}')
    echo "mail content" | mail -s $folder [email protected]
done

Awk其实也没有必要。脚本可以这样简化:

du /home/test/ | while read size folder; do
    echo "mail content" | mail -s "$folder" [email protected]
done

由于您似乎没有使用目录大小(这是du设计用来计算的) ,find因此您可以使用:

find /home/test -type d | while read folder; do
    echo "mail content" | mail -s "$folder" [email protected]
done

相关内容