find
名前に次のファイルを検索するコマンドを実行しますperl
。
find /tmp -name '*perl*'
/tmp/perl.pl
/tmp/run-perl-stage.pl
しかし、変数にPerl名を設定しPARAMETER
てfind
コマンドを再実行すると、結果は出ません! run findコマンドの使い方は$PARAMETER
?
PARAMETER=perl
find /tmp -name '*$PARAMETER*'
どんな結果も得られませんでした。
find /tmp -name '*\$PARAMETER*'
どんな結果も得られませんでした。
答え1
一重引用符ではなく二重引用符を使用する必要があります。
一重引用符内の'…'
各文字は文字通り解釈されます。特別に扱われる唯一の文字は、リテラル文字列を終了する単一引用符文字です。
二重引用符内では、"…"
次の文字は特別に扱われます。
"
(二重引用符)引用符付き文字列を終了します。$
(USD)拡張。変数置換、コマンド置換、または算術式(、、、など"$PARAMETER"
)を開始できます。"${PARAMETER}"
"${PARAMETER%/*}"
"$(somecommand)"
$((x+2))
`
(バックティック)が展開されます。これは、入れ子になったコマンドに特殊文字がある場合に使用するのが難しい別の形式のコマンドの置き換えです。`foo`
これに似ています$(foo)
が、複雑な状況で正しく使用するのは難しいです。- 対話型シェルでは、
!
履歴拡張がトリガーされることがあります。 \
(バックスラッシュ)は次の文字を引用しますが、その文字がこのリストの文字の1つである場合にのみ適用されます。他の文字の場合、バックスラッシュが予約されています。たとえば、"foo\$\bar"
と同じです'foo$\bar'
。例外的に、バックスラッシュ改行シーケンスは無視されます。バックスラッシュは次の改行文字を占めます。
その結果、一重引用符で囲まれた文字列内に一重引用符を含めることはできません。この問題を解決するには、部分を一緒にまとめることができます。間に単一引用符で囲まれた2つの文字列(単一引用符で拡張)を使用して、3つの部分で表されるパラメータをecho 'Here'\''s a string with a single quote'
渡します。echo
\'
変数置換をしたいので、二重引用符を使用してください。
find /tmp -name "*$PARAMETER*"
ところで"$PARAMETER"
とには違いがあります$PARAMETER
。シェルは二重引用符を使用して値を検索し、PARAMETER
文字列をコマンドラインに展開します。引用符がない場合、値はPARAMETER
スペースで区切られたワイルドカードパターンのリストとして解釈されます。これはほとんど望ましくないため、変数とコマンドの置換には常に二重引用符を使用してください。
答え2
まず、Bashで大文字の変数を使用しないでください。既存のシステム変数と競合する可能性があります。
第二に、あなたの質問についてこれを行うことができます(二重引用符ではなく一重引用符が必要な場合)。
param='*perl*'
find /tmp/ -name $param