当 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
的文件(如果存在)...
当我尝试使用某些规则获取文件列表时。
[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
的文件(如果存在)...