将多个参数作为单个字符串传递给外部程序

将多个参数作为单个字符串传递给外部程序

我想将多个参数传递给 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,则连接参数而不插入分隔符。

相关内容