如何在Bash中解析命令行参数(作为键值对)?有参数说与嵌套分隔符

时间:2017-09-21 22:34:48

标签: linux bash

当我解析命令行参数时,等于as分隔符可以嵌套等于。 CC =“arm-oe-linux --sysroots = / home / somelocation”CFLAGS =“” 我试过这个:

for ARGUMENT in "$@"
do
    KEY=$(echo $ARGUMENT | cut -f1 -d=)
    VALUE=$(echo $ARGUMENT | cut -f2 -d=)   

   echo $KEY
   echo $VALUE
   echo "*******************"

    case "$KEY" in

            CC)    CC=${VALUE} ;;     
        CFLAGS)    CFLAGS=${VALUE} ;;     
             *)   
    esac    
done

那但对于嵌套=这没有帮助。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

使用shell language来完成字符串操作。不需要创建昂贵的流程只是为了在第一个等号上分割字符串。

(另外,通常建议对未导出的变量使用小写变量名。)

for argument; do #syntactic sugar for: for argument in "$@"; do
    key=${argument%%=*}
    value=${argument#*=}

    echo "$key"
    echo "$value"
    echo "*******************"

    case "$key" in

            CC)    CC=$value;;
        CFLAGS)    CFLAGS=$value;;
    esac    
done

答案 1 :(得分:1)

这是因为参数包含的空格。请尝试在变量替换周围加上单引号(回答编辑)以防止它们被解析,即:

./yourscriptname.sh CC='"arm-oe-linux --sysroots=/home/somelocation"' CFLAGS='""'

此外,您的参数不止一次包含“=”。为了避免这种情况,您可以改进脚本,如下所示:

for ARGUMENT in "$@"
do
   eval $ARGUMENT 
done
echo -e CC=$CC
echo -e CFLAGS=$CFLAGS

请记住单引号。有关详细信息,请参阅eval手册页。