Bash shell-进程正确引用参数

Bash shell-进程正确引用参数,bash,shell,arguments,Bash,Shell,Arguments,假设我有一个bash脚本,如下所示,它的目的是将所有参数连接到一个命令字符串,然后执行这个命令。正如您在下面看到的,join命令无法成功执行,我认为我没有正确处理带引号的字符串。我想知道为什么以及如何纠正它 剧本: $ cat testarg.sh #!/bin/bash echo "args number: $#" args="$@" cmd="" #way 1, loop over $@ for arg in $args do echo "arg: $arg" cmd=

假设我有一个bash脚本,如下所示,它的目的是将所有参数连接到一个命令字符串,然后执行这个命令。正如您在下面看到的,join命令无法成功执行,我认为我没有正确处理带引号的字符串。我想知道为什么以及如何纠正它

剧本:

$ cat testarg.sh
#!/bin/bash
echo "args number: $#"

args="$@"

cmd=""

#way 1, loop over $@
for arg in $args
do
    echo "arg: $arg"
    cmd="$cmd $arg"
done

ttt=""

#way 2, use shift built-in
while [[ $# -gt 0  ]]
do
    k="$1"
    shift
    echo "k: $k"
    ttt="$ttt $k"
done

echo "args: $args"
echo "cmd: $cmd"
echo "ttt: $ttt"

$ttt
使用curl命令运行脚本的输出(失败):

我希望联接所有参数的原因是,将来我希望向另一个传递curl命令添加一个头。e、 g.添加一个身份验证令牌

例如,假设用户希望运行以下curl命令:

testarg.sh curl -k -X POST -H "Content-Type: application/json" -d '{"key": "value"}' "https://localhost:8443/protected_page"
对于testargs.sh,auth头将添加到curl命令中,最后执行的curl命令是:

curl -H "Authorization: Bearer <token>" -k -X POST -H "Content-Type: application/json" -d '{"key": "value"}' "https://localhost:8443/protected_page"
curl-H“Authorization:Bearer”-k-xpost-H“内容类型:application/json”-d'{“key”:“value”}”https://localhost:8443/protected_page"
提前感谢。

将“$@”复制到正则变量会破坏其中的任何引用。您希望直接循环
“$@”
,或者如果确实需要先复制它,则将其复制到数组。

“$@”
复制到正则变量会破坏其中的任何引用。您希望直接循环“$@”,或者如果确实需要先复制它,则将其复制到数组中。

args=“$@”
将所有参数连接到一个数组中:

$ set -- foo 'bar baz'
$ printf '%q\n' "$args"
foo\ bar\ baz
相反,您可以设置
args=(“$@”)

或者更好的是,完全避免引用-
对于arg
是“$@”

args=“$@”
中arg的
的语法糖,将所有参数连接成一个:

$ set -- foo 'bar baz'
$ printf '%q\n' "$args"
foo\ bar\ baz
相反,您可以设置
args=(“$@”)


或者更好的是,完全避免引用-
for arg
是“$@”
中arg的
的语法糖是的,使用数组解决了我的问题。引用的字符串被保留。非常感谢。是的,使用数组解决了我的问题。引用的字符串被保留。非常感谢。是的,我应该使用数组而不是在“$@”上循环。谢谢。是的,我应该使用数组而不是在“$@”上循环。非常感谢。
curl -H "Authorization: Bearer <token>" -k -X POST -H "Content-Type: application/json" -d '{"key": "value"}' "https://localhost:8443/protected_page"
$ set -- foo 'bar baz'
$ printf '%q\n' "$args"
foo\ bar\ baz
$ args=("$@")
$ printf '%q\n' "${args[@]}"
foo
bar\ baz