2

この質問の拡張: Bash:スペースを含む文字列に余分な一重引用符を追加する

コマンドの引数をbash配列として保存した後

touch "some file.txt"
file="some file.txt"
# Create an array with two elements; the second element contains whitespace
args=( -name "$file" )
# Expand the array to two separate words; the second word contains whitespace.
find . "${args[@]}"

次に、コマンド全体を配列に格納します

finder=( find . "${args[@]}" )

bash では、次のようにコマンドを実行できます。

"${finder[@]}"
./some file.txt

しかし、expect を使用しようとすると、エラーが発生します

expect -c "spawn \"${finder[@]}\""
missing "
   while executing
"spawn ""
couldn't read file ".": illegal operation on a directory

ここで bash 変数の展開が行われないのはなぜですか?

4

2 に答える 2

5

expect -c COMMANDCOMMAND を単一の引数にする必要があります。複数単語の引数は受け入れません。これは、"${finder[@]}"展開されるものです。

マングリングせずに空白を完全に処理したい場合は、注意が必要です。printf %q役に立つかもしれません。

于 2016-03-08T14:19:03.003 に答える
0

${finder[@]}二重引用符で囲んだ場合は、個別の単語に展開されます。

$ printf "%s\n" expect -c "spawn \"${finder[@]}\""
expect
-c
spawn "a
b
c"

したがって、expectコマンド全体を単一の引数として取得することはできません。使用できます*

$ printf "%s\n" expect -c "spawn \"${finder[*]}\""
expect
-c
spawn "a b c"

${finder[*]}IFS配列要素を、デフォルトではスペースであるの最初の文字で区切られた単一の単語に展開します。ただし、 によって追加されたスペースと元の要素の空白には区別がない*ため、これを確実に使用することはできません。

于 2016-03-08T14:17:10.520 に答える