Bash循环测试双布尔表达式:多文件类型查询脚本优化需求
扩展Bash脚本支持两种文件类型查询
没问题,我来帮你改造这个脚本,让它能同时查询两种不同的文件类型,并且用你要求的两个布尔表达式来实现匹配逻辑。
首先先说说原脚本的小问题:用ls *$1来生成文件列表的做法不太稳妥——如果文件名里包含空格或者特殊字符,循环会把它们拆成多个元素处理。我们可以用更安全的遍历方式,同时加上参数校验,让脚本更健壮。
改进后的脚本代码
#!/bin/bash # 先检查用户是否传入了两个参数 if [ $# -ne 2 ]; then echo "用法错误!请传入两个文件类型作为参数,例如:" echo " $0 .sh .c" exit 1 fi # 遍历当前目录下的所有普通文件(不含隐藏文件) for file in *; do # 用两个布尔表达式判断文件是否匹配任一类型 if [[ "$file" == *"$1" ]] || [[ "$file" == *"$2" ]]; then echo "$file" fi done
代码解释
- 参数校验:先用
[ $# -ne 2 ]检查用户是否传入了恰好两个参数,如果没有就提示正确用法并退出,避免脚本出错。 - 安全遍历:用
for file in *直接遍历目录下的文件,比解析ls的输出更可靠,能正确处理带空格的文件名。 - 双布尔表达式匹配:
[[ "$file" == *"$1" ]]:判断文件名是否以第一个传入的类型结尾(比如.sh)[[ "$file" == *"$2" ]]:判断文件名是否以第二个传入的类型结尾(比如.c)- 用
||逻辑运算符连接两个表达式,只要满足其中一个条件就会执行echo输出文件名。
额外优化(可选)
如果需要支持查询隐藏文件(比如.bashrc这类),可以修改遍历逻辑,同时排除掉.和..这两个特殊目录:
#!/bin/bash if [ $# -ne 2 ]; then echo "用法错误!请传入两个文件类型作为参数,例如:" echo " $0 .sh .c" exit 1 fi # 遍历所有文件(包括隐藏文件) for file in .* *; do # 排除.和..目录,同时匹配两种文件类型 if [[ "$file" != "." && "$file" != ".." ]] && ([[ "$file" == *"$1" ]] || [[ "$file" == *"$2" ]]); then echo "$file" fi done
这样脚本就完全满足你的需求啦,运行的时候直接传入两个类型参数就行,比如./script.sh .sh .c就能列出当前目录下所有.sh和.c文件。
内容的提问来源于stack exchange,提问作者user9213141
相关产品推荐
相关产品推荐

