bash - 如何将引用的参数从变量传递给 bash 脚本

标签 bash escaping command-line-arguments quotes

<分区>

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

测试.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

最佳答案

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

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

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

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

关于bash - 如何将引用的参数从变量传递给 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19012991/

相关文章:

Bash 将输出存储在变量中,解析并存储一些值供以后使用

regex - bash 脚本中的 Perl 命令不是解释命令(它实际上是替换它)

string - VB 字符串中的转义双引号

c# - 如何在aspx页面的标签控件中显示 `&amp;`

C中的字符转义

c# - 是否有更简单的方法使用 Microsoft.Extensions.Configuration 将数组作为命令行参数传递?

c# - 具有互斥必需参数的命令行解析器

linux - 在 linux :- I have two variable A=(a1;b2), B=(A1,B2) 中需要嵌套 while 循环需要像这样的输出 1=A1 & b2=B2

cygwin 上的 bash 脚本 - 似乎卡在连续命令之间。

c - 我是 C 网络的新手,我需要将字符串(字符数组)从命令行参数发送到服务器