将for循环的输出组合到变量

时间:2016-11-11 02:35:09

标签: bash shell for-loop

我对bash中的for循环有疑问。

我想编写一个循环遍历每个cpanel用户目录并查找某个文件的脚本。我只想循环遍历cpanel用户的文件夹而不是/ home目录中的其他文件夹。

这是我到目前为止所得到的:

cd /var/cpanel/users
for user in *
do
    find /home/$user -type f -name "*myfile*" 
done

mail -s "the results" my@email.com $MYOUTPUT

我不明白的是,我如何收集来自for..do..done循环的所有输出并将其存储在一个我可以通过电子邮件发送的变量中($ MYOUTPUT)

我在想这样做:

MYOUTPUT = ""
cd /var/cpanel/users

for user in *
do
    WHAT=$(find /home/$user -type f -name "*myfile*")
        $MYOUTPUT = $MYOUTPUT$WHAT
done


mail -s "result" my@email.com $MYOUTPUT

但那不起作用..任何想法?谢谢!!!

2 个答案:

答案 0 :(得分:4)

mail将从标准输入读取。您可以将循环的输出传递给它而不需要任何临时变量。

for user in *
do
    find /home/$user -type f -name "*myfile*" 
done | mail -s "the results" my@email.com

你甚至可以通过一个find命令搜索所有目录来摆脱循环。

find /home/* -type f -name "*myfile*" | mail -s "the results" my@email.com

实际上,*并非必要。

find /home -type f -name "*myfile*" | mail -s "the results" my@email.com

答案 1 :(得分:3)

首先要做的事情是:要为变量赋值,你必须

  1. $符号之前使用不带=的变量名称。
  2. =字符周围没有任何空格。
  3. 所以你需要的是这样的:

    for i in {1..10}; do
        myvar="$myvar $i"
    done
    echo $myvar
    

    其次,您可以将整个输出重定向到变量:

    myvar=$(for i in {1..10}; do echo $i; done)
    echo $myvar