我想将多个参数传递给 bash 脚本作为单字符串参数到外部可执行文件(尤其是git
)
我发现几个答案表明了这样的事情:
"'$*'"
"'$@'"
当传递到时看起来相当不错,echo
但当传递到外部程序时会失败,即使通过管道传输也是如此echo
。
这是一个 MWE:
#!/bin/bash
# preparation
git init .
git add -A
echo git commit -m "'$@'" # works when copied to terminal
git commit -m "'$@'" # fails if more than one parameter given
git commit -m $(echo "'$@'") # fails if more than one parameter given
rm -rf .git # c
结果是:
$ bash test.sh test2 test2
empty Git-Repository in /tests/bash-scripts/.git/ initialized
git commit -m 'test1 test2'
error: pathspec 'test2'' did not match any file(s) known to git.
error: pathspec 'test2'' did not match any file(s) known to git.
如何将多个脚本参数作为单串(包括空格)到外部可执行文件(不将它们包装""
在脚本调用中)。
刚刚发现这有效:
git commit -m "$(echo "'$@'")"
但这让我进入了下一个层次:
-m
如果没有给出参数,我想省略参数,以便触发提交消息编辑器:
if [ 0 != $# ]
then
MESSAGE ="-m " "$(echo "'$@'")"
fi
git commit $MESSAGE
或者
if [ 0 != $# ]
then
MESSAGE =("-m " "$(echo "'$@'")")
fi
echo
git commit ${MESSAGE[@]}
即使wose再次失败,引用的单词也被分开:
$bash test.sh "test1 test2" test3
git commit -m 'test1 test2 test3'
error: pathspec 'test2' did not match any file(s) known to git.
error: pathspec 'test3'' did not match any file(s) known to git.
答案1
如果要将所有参数解释为一个字符串,请使用
"$*"
IE
git commit -m "$*"
它记录在man bash
“特殊参数”下:
*
扩展到位置参数,从 1 开始。当扩展不在双引号内时,每个位置参数都会扩展为一个单独的单词。在执行它的上下文中,这些单词会受到进一步的单词分割和路径名扩展。当扩展发生在双引号内时,它会扩展为单个单词,每个参数的值由IFS
特殊变量的第一个字符分隔。即,"$*"
相当于"$1c$2c..."
,其中c
是 IFS 变量值的第一个字符。如果IFS
未设置,参数之间用空格分隔。如果IFS
为 null,则连接参数而不插入分隔符。