この台本を見ています。 mysqlバックアップスクリプトコマンド名の周りにバックティックと二重引用符を使用する理由はわかりません。
379 WHICH="`which which`"
380 AWK="`${WHICH} gawk`"
381 LOGGER="`${WHICH} logger`"
382 ECHO="`${WHICH} echo`"
383 CAT="`${WHICH} cat`"
384 BASENAME="`${WHICH} basename`"
385 DATEC="`${WHICH} date`"
386 DU="`${WHICH} du`"
387 EXPR="`${WHICH} expr`"
388 FIND="`${WHICH} find`"
389 RM="`${WHICH} rm`"
390 MYSQL="`${WHICH} mysql`"
391 MYSQLDUMP="`${WHICH} mysqldump`"
392 GZIP="`${WHICH} gzip`"
393 BZIP2="`${WHICH} bzip2`"
394 CP="`${WHICH} cp`"
395 HOSTNAMEC="`${WHICH} hostname`"
396 SED="`${WHICH} sed`"
397 GREP="`${WHICH} grep`"
修正する:
はい
"`${WHICH} gawk`"
ほぼ同じ
"${${WHICH} gawk}"
答え1
WHICH="`which which`"
WHICH=`which which`
またはWHICH=$(which which)
とまったく同じですWHICH="$(which which)"
。これらはすべてコマンドを実行しwhich which
、対応する出力(文字列)を変数としてキャプチャして、出力WHICH
から最後の改行を削除します。同様AWK="`${WHICH} gawk`"
に書き込むことができますAWK=`$WHICH gawk`
。
通常、結果にスペースまたはシェルワイルドカード文字()が含まれている場合は、コマンドの置換(`command`
または$(command)
)を二重引用符で囲む必要があります*?[\
。これは、コマンド置換(変数置換($foo
または)など)の結果が${foo}
単語の区切りとファイル名の生成(ワイルドカードとも呼ばれる)を経るためです。ただし、これは単純な変数の割り当てには機能しません。コンテキストには単一の単語が必要なので、代替結果はそのまま使用されます。したがって、割り当ては、変数とコマンドを二重引用符で置き換える必要があるという一般規則の例外です。 (この例外は二重引用符が必要な二重引用符には拡張されないことに注意してくださいexport var="$value"
。)しかし、常に二重引用符を使用することは健全なシェルプログラミング慣行です。必ずしなければならないことを知るときだけでなく、必ずしなければならないことを知るときにのみ省略してください。それを書く。
which which
空白またはワイルドカードを含むパスが返される(まれな場合)、次の行に${WHICH}
二重引用符で囲む必要があります。つまり、次のいずれかです。
AWK="`"${WHICH}" gawk`"
AWK=`"${WHICH}" gawk`
AWK="$("${WHICH}" gawk)"
AWK=$("${WHICH}" gawk)
(内部的にネストされた参照を取得するのは難しいため、$(…)
moreを使用することをお勧めします。ただし、非常に古いシェルはそれを認識しないため、古いシステムで実行する必要があるスクリプトはそれを使用する必要があります。)`…`
`…`
$(…)
`…`
また、見ることができます$VAR対${VAR}と引用
答え2
逆引用符を付けた場合は、スペースを含む文字列を返します。引用符は、完全な単一値が変数に割り当てられるようにします。
答え3
バックティック演算子は、「バックティック間の領域をバックティック内のコマンドの出力に置き換えます。二重引用符はこれを行います。その出力にスペースが含まれている場合、関連変数は最初のスペースだけでなく全体の結果に設定されます。すべての結果。
たとえば、何らかの理由でgrepコマンドが '/usr/local/bin/real grep'の場合、実行後
GREP=`which grep`
GREP には「/usr/local/bin/real」が含まれます。
一方、
GREP="`which grep`"
GREP には「/usr/local/bin/real grep」が含まれます。
これらのコマンドへのパスにスペースが含まれる可能性はありませんが、シェルスクリプトの一般的なベストプラクティスは、変数に割り当てるときに常に二重引用符を使用することです。