【问题标题】:How to pass quoted arguments from variable to bash script [duplicate]如何将引用的参数从变量传递到bash脚本[重复]
【发布时间】:2013-10-01 12:31:02
【问题描述】:

我尝试在变量中构建一组参数并将其传递给脚本,但行为与我的预期不同。

test.sh

#!/bin/bash

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

输入

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

输出

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

预期

-a
arg one
-b
arg two

请注意,如果您将引用的参数直接传递给它可以工作的脚本。我也可以使用 eval 解决这个问题,但我想了解第一种方法失败的原因。

解决方法

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

【问题讨论】:

  • 仅供参考,for var in "$@; do"for var; do 相同。
  • eval 不是一种变通方法,它是这样做的方法。
  • @EranBen-Natan,使用 eval compromises security。它完全不适合数据不是由至少与软件开发人员一样受信任的人手写的情况。

标签: bash escaping command-line-arguments quotes


【解决方案1】:

你应该使用一个数组,它在某种意义上提供了第二层引用:

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

数组扩展为数组的每个元素生成一个单词,因此在构造传递给test.sh 的参数列表时,您在创建数组时引用的空格不会被视为单词分隔符。

请注意,POSIX shell 不支持数组,但这是 POSIX shell 中引入数组来纠正的确切缺点。

【讨论】:

    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2011-10-10
    相关资源
    最近更新 更多