You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码解释

  1. 参数校验:先用[ $# -ne 2 ]检查用户是否传入了恰好两个参数,如果没有就提示正确用法并退出,避免脚本出错。
  2. 安全遍历:用for file in *直接遍历目录下的文件,比解析ls的输出更可靠,能正确处理带空格的文件名。
  3. 双布尔表达式匹配:
    • [[ "$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:57:49