あなたのシェルは両方、引用符を解釈している'
と"
、彼らがさえに到達する前に、echo
。私は通常、不要な場合でもエコーする引数を二重引用符で囲みます。例えば:
$ echo "Hello world"
Hello world
したがって、最初の例で、出力にリテラル引用符を含める場合は、エスケープする必要があります。
$ echo \'Hello world\'
'Hello world'
または、引用符付きの引数内で既に使用する必要があります(ただし、同じ種類の引用符は使用できません。または、とにかくエスケープする必要があります)。
$ echo "'Hello world'"
'Hello world'
$ echo '"Hello world"'
"Hello world"
2番目の例では、文字列の中央でコマンド置換を実行しています。
grep $ARG /var/tmp/setfile | awk {print $2}
で始まるもの$
もシェルによって特別に処理されます-シェルはそれらを変数として扱い、値で置き換えます。ほとんどの場合、これらの変数はどちらもシェルに設定されていないため、実際に実行されるだけです
grep /var/tmp/setfile | awk {print}
grep
引数は1つしか表示されないため、引数は検索対象のパターンであり、データを読み取る場所はstdinであると想定しているため、入力待ちをブロックしています。2番目のコマンドがハングしたように見えるのはそのためです。
これは、引数を単一引用符で囲むと発生しません(これが最初の例がほぼ機能した理由です)。これは、必要な出力を取得する1つの方法です。
echo \'' echo PARAM=` grep $ARG /var/tmp/setfile | awk '{print $2}' ` '\'
二重引用符で囲むこともできますが、$
s をエスケープしてシェルが変数として解決しないようにする必要があります。
echo "' echo PARAM=\` grep \$ARG /var/tmp/setfile | awk '{print \$2}' \` '"