解析包含bash脚本中的空格的输入选项

时间:2011-02-12 18:29:03

标签: bash shell input whitespace

我有一个bash脚本使用一段代码解析输入选项,如下所示

for WORD in "$@" ; do
 case $WORD in
  --*) true ;
    case $WORD in
      --opt1=*) 
          OPT1=${WORD/--opt1=/}
          shift ;;
      --opt2=*) 
          OPT2=${WORD/--opt2=/}
          shift ;;
      *) echo "Unrecognized argument $WORD"      
          ;; 
    esac ;;
  *) echo "Option $WORD not starting with double dash."  
  ;; 
 esac
done

该脚本由另一个创建整个命令行的父程序调用。 此父程序创建的输出类似于

./childscript.sh "--opt1=value1 --opt2=value2"

生成的行看起来像

时出现问题
./childscript.sh "--opt1='value11 value12' --opt2=value2"

脚本抱怨说

Option value12 not starting with double dash.

如何修改子bash代码以使其理解输入选项中的空格?

1 个答案:

答案 0 :(得分:1)

我不认为生成的行是您认为的那样。

如果我直接调用它,你的代码对我来说完全没问题。添加回声以检查值是否存储在正确的位置:

$ ./child.sh --opt1='v1 v2' --opt2='v3 v4'
OPT1='v1 v2'
OPT2='v3 v4'

您应该能够确认这一点。你的问题不是让子脚本接受这样的参数,而是让父脚本正确地调用它。

顺便说一下,你实际上想要运行这样的东西:

./childscript.sh "--opt1=value1 --opt2=value2"

这将导致整个字符串(--opt1=value1 --opt2=value2)被读作单个参数。我怀疑你没有告诉我们关于父脚本调用它的方式的完整故事。如果你向我们展示这些细节,我们可能会提供更多帮助 - 或者这可能是一个暗示。