如何在同一Shell脚本中将第一个while循环输出作为第二个循环输入
可行的实现方案
嘿,我看出来你想让第一个循环生成的邮箱路径列表(也就是test1文件)作为第二个循环的输入,来执行imcheck和imscripter命令。原脚本里第二个while循环的写法有问题——你把变量名和文件名搞混了,而且没明确指定要读取的文件,这就导致它没法正常工作。下面是修正后的完整脚本,我会一步步给你解释改进点:
#!/bin/bash set -x # 第一步:生成包含用户所有邮箱路径的test1文件 while read uid; do # 提取当前用户下的所有邮箱路径,跳过前两行无关的表头输出 mboxutil -lp "user/${uid}/*" | awk '{print $7}' | sed '1,2d' >> test1 done < your_uid_list.txt # 注意:这里要替换成你的UID列表文件,比如每行一个用户ID(像d_raj)的文件 # 第二步:读取test1里的邮箱路径,执行目标命令 while read -r mbox_path; do # 执行去重操作,生成clean_dedup文件 imcheck -m "${mbox_path}" | dedupbymsgid.pl > clean_dedup # 执行imscripter命令,注意密码用单引号包裹避免特殊字符解析问题 imscripter -u admin -f clean_dedup -v EBbo0C -s "$1" -x 'zANv5*7UB#SFg$]#' done < test1 # 明确指定从test1文件读取每行内容
关键改进点:
- 第一个循环的输入源:原脚本里第一个
while read x没有指定输入文件,你肯定有一个包含用户UID的列表文件(比如每行一个ID),所以我加上了< your_uid_list.txt,记得替换成你实际的文件名。 - 解决变量名冲突:第二个循环把读取的变量改成了
mbox_path,避免和文件名test1重名,同时用-r参数防止shell转义路径里的特殊字符(比如空格、冒号这些)。 - 明确读取文件:第二个循环末尾的
< test1是核心——它告诉shell要从test1文件里读取每行内容,作为循环的输入。 - 实际执行命令:原脚本里用
echo只是打印命令,不会真的执行。如果你确实要运行这些命令,就去掉echo;如果是想生成可执行的脚本文件,那可以改成echo "..." >> run_commands.sh,之后再执行这个脚本。
额外优化建议(可选):
如果你不想生成test1这个临时文件,可以直接把第一个循环的输出通过管道传给第二个循环,这样更高效,还省去了清理临时文件的麻烦:
#!/bin/bash set -x while read uid; do mboxutil -lp "user/${uid}/*" | awk '{print $7}' | sed '1,2d' done < your_uid_list.txt | while read -r mbox_path; do imcheck -m "${mbox_path}" | dedupbymsgid.pl > clean_dedup imscripter -u admin -f clean_dedup -v EBbo0C -s "$1" -x 'zANv5*7UB#SFg$]#' done
内容的提问来源于stack exchange,提问作者Misrty vib
相关产品推荐
相关产品推荐

