Bash shell-进程正确引用参数
假设我有一个bash脚本,如下所示,它的目的是将所有参数连接到一个命令字符串,然后执行这个命令。正如您在下面看到的,join命令无法成功执行,我认为我没有正确处理带引号的字符串。我想知道为什么以及如何纠正它 剧本: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=
$ 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