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

如何用Bash判断一个字符串的所有字符均存在于另一字符串中

判断Bash中字符串所有字符是否存在于另一个字符串

给定变量:

var_1="abcdefg"
var_2="bcg"

需要判断var_2的每一个字符是否都存在于var_1中(不要求顺序或连续),而不是判断var_2是否是var_1的子串。你之前尝试的[[ $var_1 == *$var_2* ]]仅能检测子串,不符合需求,以下是几种可行方案:

方案1:逐个字符遍历检查(适合新手理解)

通过循环遍历var_2的每个字符,逐一验证是否存在于var_1中:

var_1="abcdefg"
var_2="bcg"

all_chars_present=true
# 遍历var_2的每个字符
for (( i=0; i<${#var_2}; i++ )); do
    char="${var_2:i:1}"  # 提取第i个字符
    # 如果当前字符不在var_1中,标记为不满足并终止循环
    if [[ "$var_1" != *"$char"* ]]; then
        all_chars_present=false
        break
    fi
done

# 根据标记结果输出信息
if $all_chars_present; then
    echo "All characters of var_2 occur in var_1."
else
    echo "Not all characters of var_2 occur in var_1."
fi
  • ${#var_2}获取var_2的字符长度,${var_2:i:1}提取索引为i的单个字符
  • 只要发现一个字符不在var_1中,立即终止循环,提升效率

方案2:利用Bash扩展glob(简洁写法)

开启Bash的扩展glob功能,构造模式检测var_2是否包含var_1以外的字符:

# 开启扩展glob
shopt -s extglob
var_1="abcdefg"
var_2="bcg"

# *([!"$var_1"]) 匹配任意数量的不在var_1字符集中的字符
if [[ "$var_2" == *([!"$var_1"])* ]]; then
    echo "Not all characters of var_2 occur in var_1."
else
    echo "All characters of var_2 occur in var_1."
fi
# 关闭扩展glob(可选,根据需求保留)
shopt -u extglob

方案3:使用grep工具

通过grep的字符集匹配功能,检测var_2是否存在var_1以外的字符:

var_1="abcdefg"
var_2="bcg"

# [^$var_1] 匹配任何不在var_1中的字符,-q表示静默模式不输出内容
if echo "$var_2" | grep -q "[^$var_1]"; then
    echo "Not all characters of var_2 occur in var_1."
else
    echo "All characters of var_2 occur in var_1."
fi

注意事项

如果var_1包含特殊字符(如^、]、-),需要先转义这些字符避免字符集解析错误,例如:

# 转义var_1中的特殊字符
escaped_var_1=$(printf "%s" "$var_1" | sed 's/[][^$-]/\\&/g')
# 之后使用"[^$escaped_var_1]"作为匹配模式

内容的提问来源于stack exchange,提问作者cheddarblake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:50:26