如何修改Bash脚本以区分匹配的-p+([[:digit:]])模式?
修改Bash脚本以区分匹配的具体模式
原脚本仅能检测输入是否匹配数组中的任一模式,但无法区分具体匹配的类型。要实现针对"-p+([[:digit:]])"模式执行特定操作、其他匹配或不匹配执行对应操作的需求,可以通过以下两种方式修改:
方式一:直接分别判断模式(适合模式数量少的场景)
这种方式无需使用数组,直接针对每个模式做独立判断,逻辑清晰直观:
#!/bin/bash # 定义各个模式 p_pattern="-p+([[:digit:]])" g_pattern="-g" # 获取用户输入 read -p "Enter input: " user_input # 分支判断匹配的模式 if [[ $user_input =~ $p_pattern ]]; then echo "输入匹配了-p+数字的模式" # 在这里执行该模式对应的特定操作 # 示例:提取-p后面的数字 digit="${user_input#-p}" echo "提取到的数字为: $digit" elif [[ $user_input =~ $g_pattern ]]; then echo "输入匹配了-g模式" # 执行-g模式对应的操作 else echo "输入不匹配任何预设模式" # 执行不匹配时的操作 fi
方式二:用关联数组管理模式(适合模式数量多、需扩展的场景)
如果后续需要添加更多模式,可以用关联数组存储模式与对应的标识,循环检测后通过case分支处理:
#!/bin/bash # 用关联数组存储模式名称和对应的正则表达式 declare -A patterns=( ["p_digit_mode"]="-p+([[:digit:]])" ["g_mode"]="-g" ) # 获取用户输入 read -p "Enter input: " user_input matched_mode="" # 循环检测每个模式 for mode_name in "${!patterns[@]}"; do current_pattern="${patterns[$mode_name]}" if [[ $user_input =~ $current_pattern ]]; then matched_mode="$mode_name" break fi done # 根据匹配的模式执行对应操作 case "$matched_mode" in "p_digit_mode") echo "输入匹配了-p+数字的模式" # 执行该模式的特定操作 digit="${user_input#-p}" echo "提取到的数字: $digit" ;; "g_mode") echo "输入匹配了-g模式" # 执行-g对应的操作 ;; *) echo "输入不匹配任何预设模式" # 执行不匹配时的操作 ;; esac
核心修改思路
原脚本仅记录了是否匹配的布尔值,修改的关键在于跟踪具体匹配的模式类型,无论是直接分支判断还是通过关联数组标记模式名称,最终都能根据匹配结果执行差异化操作。
内容的提问来源于stack exchange,提问作者Dilna
相关产品推荐
相关产品推荐

