如何用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
相关产品推荐
相关产品推荐

