当 bash 脚本列出目录中的相应文件时,但无法正常工作?

When a bash script lists correspond file in directory, but not working properly?

当我尝试使用某些规则获取文件列表时。

[rtrs@10.10.12.12:~]
$ for x in ./*;do echo $x; done;
/home/mariolu/out_protocol
/home/mariolu/proto
/home/mariolu/proto2
/home/mariolu/protocol_build.3.6.1.sh
/home/mariolu/protocol_build.3.6.sh
/home/mariolu/replace_pb_lite_runtime.sh

有效。

当我只列出 .sh 个文件时。它也有效。

[rtrs@10.10.12.12:~]

$ for x in ./*.sh;do echo $x; done;
/home/mariolu/protocol_build.3.6.1.sh
/home/mariolu/protocol_build.3.6.sh
/home/mariolu/replace_pb_lite_runtime.sh

但我尝试只列出 .proto 个文件。它无法正常工作。

[rtrs@10.10.12.12:~]
$ for x in ./*.proto;do echo $x; done;
*.proto

Bash 将 $x 视为字符串 *.proto。但这里的意图是 $x 是一个空列表,代码从“for 循环”中断。

我经常在脚本中使用 shopt,但是当您不想使用时,您应该明确地测试结果。

您可以测试 glob 字符串本身 -

for x in *.proto;
do [[ "$x" == '*.proto' ]] && continue
   echo $x
done

但是“*.proto”实际上是一个有效的文件名,所以它可能会被创建,这会跳过它。这可能是错误或功能,具体取决于您的需要。

另一种方法是测试文件名是否确实存在。

for x in ./*.proto;
do [[ -e "$x" ]] && echo $x
done

包含任何字面上命名为 *.proto 的文件(如果存在)...