如何用Shell提取等号分隔的参数值至独立变量?
提取字符串中指定参数的值
现有字符串 STRING="/something an-arg=some-value another-arg=another-value",需要将an-arg对应的some-value提取到AN_ARG变量,another-arg对应的another-value提取到ANOTHER_ARG变量。以下是几种简洁可行的解决方案:
方案1:纯Bash参数扩展(无外部工具依赖)
利用Bash的参数扩展特性,先截掉参数名之前的内容,再截掉参数值之后的部分:
STRING="/something an-arg=some-value another-arg=another-value" # 提取an-arg的值 AN_ARG=${STRING#*an-arg=} # 得到 "some-value another-arg=another-value" AN_ARG=${AN_ARG%% *} # 从右截断第一个空格及后续内容,得到 "some-value" # 提取another-arg的值 ANOTHER_ARG=${STRING#*another-arg=} ANOTHER_ARG=${ANOTHER_ARG%% *} # 输出验证 echo "AN_ARG: $AN_ARG" echo "ANOTHER_ARG: $ANOTHER_ARG"
方案2:使用sed正则匹配
通过sed的正则捕获组直接提取目标值:
STRING="/something an-arg=some-value another-arg=another-value" AN_ARG=$(sed -n 's/.*an-arg=\([^ ]*\).*/\1/p' <<< "$STRING") ANOTHER_ARG=$(sed -n 's/.*another-arg=\([^ ]*\).*/\1/p' <<< "$STRING") echo "AN_ARG: $AN_ARG" echo "ANOTHER_ARG: $ANOTHER_ARG"
说明:[^ ]*匹配任意非空格字符,精准捕获参数值部分。
方案3:使用awk遍历字段
以=为分隔符遍历字段,匹配目标参数名后提取对应值:
STRING="/something an-arg=some-value another-arg=another-value" AN_ARG=$(awk -F'=' '{for(i=1;i<=NF;i++){if($i=="an-arg"){print $(i+1)}}}' <<< "$STRING") ANOTHER_ARG=$(awk -F'=' '{for(i=1;i<=NF;i++){if($i=="another-arg"){print $(i+1)}}}' <<< "$STRING") echo "AN_ARG: $AN_ARG" echo "ANOTHER_ARG: $ANOTHER_ARG"
内容的提问来源于stack exchange,提问作者joliver
相关产品推荐
相关产品推荐

