2

我将脚本中的一个问题隔离到这个小示例中。这就是我得到的:

$ cmd="test \"foo bar baz\""
$ for i in $cmd; do echo $i; done
test
"foo
bar
baz"

这就是我所期望的:

$ cmd="test \"foo bar baz\""
$ for i in $cmd; do echo $i; done
test
"foo bar baz"

如何更改我的代码以获得预期的结果?


更新也许我的第一个例子不够好。我查看了 Rob Davis 的答案,但无法将解决方案应用于我的脚本。我试图简化我的脚本以更好地描述我的问题。这是脚本:

#!/bin/bash
function foo {
  echo $1
  echo $2
}

bar="b c"

baz="a \"$bar\""
foo $baz

这是与脚本输出相比的预期输出:

expected  script
a         a 
"b c"     "b
4

2 回答 2

2

首先,你要求双引号foo bar baz同时做两件事,而他们不能。您希望他们将这三个单词组合在一起,并且希望它们显示为文字。所以你需要介绍另一对。

其次,解析发生在您设置cmd, 并cmd设置为单个字符串时。您希望将其作为单个元素使用,因此一种解决方案是使用数组变量。sh有一个名为 的数组@,但是由于您使用的是 bash ,因此您可以将cmd变量设置为数组。

此外,为了保持元素内的间距,最好在 . 周围加上双引号$ifoo如果在and之间放置多个空格,您就会明白为什么bar

$ cmd=(test "\"foo bar baz\"")
$ for i in "${cmd[@]}"; do echo "$i"; done

有关 sh 和 bash的特殊或解析功能的更多详细信息,请参阅此问题。"$@""${cmd[@]}"

更新

将此想法应用于您问题中的更新,尝试像这样设置baz和调用foo

$ baz=(a "\"$bar\"")
$ foo "${baz[@]}"
于 2012-04-26T18:40:28.373 回答
0

为什么首先引用它?

for i in test "foo bar baz"; do echo $i; done
于 2012-04-26T17:51:23.843 回答