How to pass quoted arguments from variable to bash script

自闭症网瘾萝莉.ら 提交于 2019-12-17 19:48:31

问题


I tried building a set of arguments in a variable and passing that to a script but the behavior different from what I expected.

test.sh

#!/bin/bash

for var in "$@"; do
  echo "$var"
done

input

usr@host$ ARGS="-a \"arg one\" -b \"arg two\""
usr@host$ ./test.sh $ARGS

output

-a
"arg
one"
-b
"arg
two"

expected

-a
arg one
-b
arg two

Note if you pass the quoted arguments directly to the script it works. I also can work around this with eval but I wanted to understand why the first approach failed.

workaround

ARGS="./test.sh -a "arg one" -b "arg two""
eval $ARGS

回答1:


You should use an array, which in some sense provides a 2nd level of quoting:

ARGS=(-a "arg one" -b "arg two")
./test.sh "${ARGS[@]}"

The array expansion produces one word per element of the array, so that the whitespace you quoted when the array was created is not treated as a word separator when constructing the list of arguments that are passed to test.sh.

Note that arrays are not supported by the POSIX shell, but this is the precise shortcoming in the POSIX shell that arrays were introduced to correct.



来源:https://stackoverflow.com/questions/19012991/how-to-pass-quoted-arguments-from-variable-to-bash-script

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!