Bash 将所有参数作为一个带引号的参数传递给另一个命令

Bash pass all arguments as one quoted argument to another command

我通常这样做:

git commit -m "My hands are typing words!"

我已经厌烦了,所以我做了这批:

@echo off
set var=%*
git commit -m "%var%"

作为:

commit.bat blah blah blah

所以我可以删除 -m 和引号,但它会添加 .bat。当我删除文件扩展名时,git Bash 试图将批处理解释为 bash。所以我需要改用 bash 语法。没关系,我试过这个:

#!/usr/bin/bash
git commit -m "$@"

这不起作用,它将参数作为多个参数传递。它调用这个:

git commit -m My hands are typing words!

我尝试添加更多引号 (git commit -m ""$@""),但没有效果。

那么如何将所有参数转换为可以在 bash 中传递给另一个命令的字符串?

您可以使用 "$*" 而不是 "$@"
这个示例脚本应该解释它:

$ cat a.sh
#!/bin/bash
echo '$*:'
printf "%s\n" $*
echo
echo '"$*":'
printf "%s\n" "$*"
echo
echo '$@:'
printf "%s\n" $@
echo
echo '"$@":'
printf "%s\n" "$@"

$ ./a.sh a b "c    d"             e
$*:
a
b
c
d
e

"$*":
a b c    d e

$@:
a
b
c
d
e

"$@":
a
b
c    d
e

但正确的是,您应该在传递给脚本之前使用“$1”并引用您的消息字符串。
在上面的示例中,您可以看到保留了 c 和 d 之间的空格,但是 "c d" 和 e 之间的空格丢失了。