如何在shell脚本中接受带引号的句子作为参数

时间:2018-06-30 05:56:38

标签: bash shell command-line quoting

我正在尝试以类似于bash的方式在中引用带引号的参数

$ git commit -m "message as a sentence"

$ something "foo bar"

然后,我想提取message as a sentencefoo bar

到目前为止,我所做的是:

if [[ "$2" =~ "-m" ]]; then
  if [ -z $3 ]; then
    echo  "Must have a message"
  else
    # @TODO
  fi
fi

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

从注释继续,在命令行中有关脚本参数的操作由外壳程序处理。因此,当您提供命令行参数时,将应用常规的shell扩展和单词拆分。当您在脚本中引用参数时,您的外壳程序会适当地避免在引号中引起单词拆分,但是实际的引号本身会被外壳程序删除。

在脚本中,位置参数将正确包含外壳程序处理参数的结果。因此,根据您的情况,您的脚本(或示例中的git)将会收到,

$1 : commit
$2 : -m 
$3 : your message as a sentence

您的脚本逻辑很好,您在脚本中遇到的问题是引用不正确。具体来说,[[ ... ]]不需要引号,但是[ ... ]不需要引号。

由于您没有在$3中引用[ -z $3 ],因此您实际上是在问:

[ -z your message as a sentence ]

shell将接受太多参数。因此,要解决此问题,请在使用test[ ... ](同义)时引用,例如

[ -z "$3" ]

仔细检查一下,如果还有其他问题,请告诉我。