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 之间的空格丢失了。
我通常这样做:
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 之间的空格丢失了。