【问题标题】:Pass bash variable with quotes as argument [duplicate]传递带有引号的bash变量作为参数[重复]
【发布时间】:2023-03-03 08:13:22
【问题描述】:

我有一个变量:

var='aaa bbb "ccc ddd"'

还有下面的参数——打印./script.sh

#!/bin/bash

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

预期结果:

$ ./script.sh $var
aaa
bbb
ccc ddd

实际结果:

$ ./script.sh $var
aaa
bbb
"ccc
ddd"
$ ./script.sh "$var"
aaa bbb "ccc ddd"
$ ./script.sh ${var@Q}
'aaa
bbb
"ccc
ddd"'

有没有办法实现它?

我无法控制 $var - 例如,它不能是数组。

【问题讨论】:

  • 如果var 是一个数组,它的内容会是什么样子?您至少需要举一个例子,就像您为标量提供的那样。此外,还不清楚var="aaa bbb 'ccc ddd'"var='aaa bbb `ccc ddd`' 的预期结果应该是什么。您需要定义 var 内允许使用哪些引号。
  • 作为一个数组很简单:arr=(aaa bbb "ccc ddd"), ./script.sh "${arr[@]}"。我的意思是,它不能是一个数组,我得到$var 作为给定的,需要使用它
  • 对不起,在这一点上误读了您的问题。不过,您需要澄清我提到的其他问题。此外,了解var 中可以出现哪些其他字符也很重要。例如,是否只有字母、空格和引号?
  • var 就是这样。我无法控制它。我想使用一些 bash-quoting-voodoo-magic 将它传递给./script.sh,以某种方式给我预期的输出。我想像 ./script aaa bbb "ccc ddd" 一样工作,但使用 var 而不是显式参数。

标签: bash shell escaping quoting


【解决方案1】:

找到了解决办法!

$ echo "$var" | xargs ./script
aaa
bbb
ccc ddd

【讨论】:

  • 只是出于好奇:如果你设置var='aaa bbb ccc ddd"'(即省略第一个双引号),你仍然得到你期望的结果吗?
  • xargs 以代码 1 退出,我想这是我对解析错误的期望。它运行 ./script.sh 并带有所有格式正确的参数,这并不理想,但在我的情况下 $var 是受信任的,所以无论哪种方式都不是问题
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2015-12-26
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
相关资源
最近更新 更多