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"

期待される結果を得るためにコードを変更するにはどうすればよいですか?


UPDATE多分私の最初の例は十分ではありませんでした。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 baz2 つのことを同時に行うように要求していますが、それはできません。3 つの単語をグループ化し、リテラルとして表示する必要があります。そのため、別のペアを紹介する必要があります。

次に、 を設定すると解析がcmd行わcmdれ、単一の文字列に設定されます。個々の要素として操作したいので、1 つの解決策は配列変数を使用することです。shという配列@がありますが、bash を使用しているので、cmd変数を配列に設定するだけです。

また、要素内の間隔を維持するには、二重引用符で囲むことをお勧めします$ifooと の間に複数のスペースを入れると、その理由がわかりますbar

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

sh と bash の特別な機能または解析機能の詳細については、それぞれこの質問を参照してください。"$@""${cmd[@]}"

アップデート

このアイデアを質問の更新に適用して、次のように設定して呼び出してみてくださいbazfoo

$ 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 に答える