如何在bash中传递字符串参数并维护字符串?

时间:2019-04-09 15:46:54

标签: bash

我正在为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

3 个答案:

答案 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正在删除那里的报价。