我正在为bash中的命令制作包装脚本,我想使用空格传递字符串参数,同时将其作为字符串保留在bash文件中。
我已经看到许多问题,这些问题涉及将字符串作为一项传递给bash脚本,但不是如何维护字符串(如果意图是在脚本中使用该字符串时将其保留为字符串)。
我还尝试了多种不同的引号和转义字符方式,以查看是否有区别
我的脚本的布局示例是
#!/usr/bin/env bash
exec my_program /path/to/code.py "${@}"
当我执行my_script -arg "A string"
时,所需的行为是使包装后的命令以my_program /path/to/code.py -arg "A string"
的身份执行,但以my_program /path/to/code.py -arg A string
的身份运行,从而产生error: unrecognized arguments: string
。
有什么方法可以确保在传递字符串时,它将一直保持字符串向下?
最小,完整和可验证的示例:
bash_strings.sh
echo "${@}"
输出
$ bash bash_strings.sh --test "A String"
--test A String
答案 0 :(得分:3)
只要bash_strings.sh
丢弃数据(使echo "$@"
看起来与./yourscript "hello world"
相同),您的./yourscript "hello" "world"
就是越野车。要准确反映命令的参数列表,请使用printf %q
生成带引号的版本,如下所示:
#!/usr/bin/env bash
(( $# )) || exit
printf '%q ' "$@"; echo
...对于./bash_strings --test "A string"
,将作为输出发出:
--test 'A string'
...或者可能是其他语义相同的表示形式,例如:
--test A\ string
...无论哪种方式,都反映了原始报价确实是通过的。
答案 1 :(得分:-2)
Bash会删除引号。您必须再次插入它们。但是,如果您在包装中转义了引号,则每个参数都将在引号内进行解释:
exec my_program /path/to/code.py \"${@}\"
将成为
my_program /path/to/code.py "-arg A string"
您也不想要的
我认为最好的方法是,如果您的包装程序适用于特定程序,请使用不同的标志执行case
,例如:
while getopts "arg:r:v" arg; do
case "$arg" in
arg)
exec my_program /path/to/code.py -arg $OPTARG
;;
r)
exec my_program /path/to/code.py -r $OPTARG
;;
v)
exec my_program /path/to/code.py -v $OPTARG
;;
esac
done
答案 2 :(得分:-2)
编辑为OP时,为了清楚起见对问题进行了编辑。
如果您将输入更改为:
bash bash_strings.sh --test "\"A String\""
对于此特定示例,将起作用。 Bash正在删除那里的报价。