【问题标题】:Combine output of for loop to variable将 for 循环的输出合并到变量中
【发布时间】:2016-11-11 02:35:09
【问题描述】:

我对 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

但这不起作用..有什么想法吗?谢谢!!!

【问题讨论】:

  • 仅供参考,分配的 = 周围不能有空格。你必须写MYOUTPUT="" 而不是MYOUTPUT = ""

标签: bash shell for-loop


【解决方案1】:

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

【讨论】:

  • ... 没有必要。 ... 这并不完全正确。假设您有一个文件 /home/.myfile(这不太可能,但可能),find /home 会找到它,但 find /home/* 不会。
【解决方案2】:

首先要做的事情:要将某些内容分配给变量,您必须

  1. = 符号前使用不带$ 的变量名。
  2. = 字符周围没有任何空格。

所以你需要的是这样的:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2015-12-26
    • 2020-02-27
    • 2020-09-05
    相关资源
    最近更新 更多