引用時にパラメータを無視

引用時にパラメータを無視

3つのファイルがあるディレクトリfile1file2次のbashスクリプトがあります。

#!/bin/bash
set -e

Command="ls -1 -I file1"
echo "Command: $Command"

Files=`$Command`
echo "Files:"
echo $Files

結果は予想した通りだった。つまり、file1無視され、リストには表示されません。

$ ./test.sh
Command: ls -1 -I file1
Files:
file2
test.sh

名前にスペースが含まれているファイルを無視するようにサポートするにはどうすればよいですか?ファイル名を引用符で囲む必要がありますか?素晴らしい...

#!/bin/bash
set -e

Command="ls -1 -I 'file1'"
echo "Command: $Command"

Files=`$Command`
echo "Files:"
echo $Files

生産する:

$ ./test.sh
Command: ls -1 -I 'file1'
Files:
file1
file2
test.sh

ただし、Bashで同じコマンドを直接評価すると、正しい結果が得られます。

$ ls -1 -I 'file1'
file2
test.sh

ここで何が起こっているのでしょうか?引用符を追加すると、何かを脱線するようですが、なぜですか?

コマンドを次のように変更すると役に立ちません。

Command="ls -1 -I \"file1\""
Command="ls -1 --ignore='file1'"

コマンドの評価を変更しても役に立ちません。

Files=$($Command)
Files=$(`echo $Command`)

正しい動作は導入によってのみ達成できるようです。eval

Files=$(eval $Command)
Files=`eval $Command`

なぜそれが評価され実行されるのか理解したいのですが、引用されlsたパラメータは追加されない限り無視されます。eval

ベストアンサー1

なぜなら見積もりの​​削除引用符自体が引用符で囲まれている場合、引用符には適用されません。

存在する:

Command="ls -1 -I 'file1'"

一重引用符'は二重引用符で囲まれているため、"文字列の一部と見なされます。printfwith %q(in bashkshand zsh)を使用して次のことを確認できます。

$ printf '%q\n' "$Command"
ls -1 -I 'file1'

端末で直接実行すると、単一引用符は引用符ではなくシェルから削除されます。

おすすめ記事