Linux服务器中基于指定文件筛选子目录查看内容的循环命令报错排查
问题分析与解决方案
你的问题出在内层反引号的误用上,咱们来拆解一下:
你写的命令里,do ls /srv/log/$i/`` 这部分用了反引号,shell会把反引号里的ls命令执行结果当作新的shell命令去运行,而不是直接输出结果。比如当ls /srv/log/server2/返回folder1 folder2 folder3时,shell就会尝试依次执行folder1、folder2这些命令——但这些只是目录名,不是可执行命令,所以就会弹出-bash: folder1: command not found这类报错,同时因为错误中断,后面的内容也没机会正常输出。
修正后的基础命令
只需要去掉内层的反引号,让ls直接执行并输出结果就行:
for i in `cat del_list`; do ls /srv/log/$i/; done
更稳妥的进阶写法
如果你的del_list文件里的服务器名可能包含空格、特殊字符(比如下划线以外的符号),或者每行可能有多余的空格,建议用while read循环,处理起来更可靠:
while read -r server; do ls "/srv/log/$server/" done < del_list
这里的-r参数是防止反斜杠被意外转义,双引号包裹路径可以避免特殊字符导致的路径解析错误。
优化输出可读性
如果想清晰区分每个服务器的目录内容,可以加个提示信息:
while read -r server; do echo "--- 目录 /srv/log/$server/ 的内容 ---" ls "/srv/log/$server/" done < del_list
内容的提问来源于stack exchange,提问作者joker20
相关产品推荐
相关产品推荐

