6

bash の任意のコマンドに引数を変数として渡そうとすると、変数値にスペースが含まれていると、bash によって追加された余分な引用符が表示されます。

ファイル「some file.txt」を作成し、変数 $file に追加しています。$file を使用して、別の変数 $arg に格納し、$file を引用符で囲みます。bashによる変数展開の後に私が望んでいるコマンドは

find . -name "some text.txt"

しかし、エラーが発生し、実際に実行されたファイルは、

find . -name '"some' 'file.txt"

なぜこうなった。この場合、bash 変数 expanson はどのように機能しますか?

$ touch "some file.txt"
$ file="some file.txt"
$ arg=" -name \"$file\""

$ find . $arg
find: paths must precede expression: file.txt"
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

$ set -x
$ find . $arg
+ find . -name '"some' 'file.txt"'
find: paths must precede expression: file.txt"
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

なぜこれが起こっているのですか?

4

1 に答える 1

8

パラメータの値の引用符は、パラメータが展開された後、リテラル文字として扱われます。あなたの試みは

find . -name \"some file.txt\"

いいえ

find . -name "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[@]}"
于 2015-11-23T12:56:09.520 に答える