シェルスクリプトで二重引用符と逆引用符を使用するのはなぜですか?

シェルスクリプトで二重引用符と逆引用符を使用するのはなぜですか?

この台本を見ています。 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}と引用

おすすめ記事