二重引用符で囲まれた変数やエコーの行全体に違いはありますか?

二重引用符で囲まれた変数やエコーの行全体に違いはありますか?

たとえば、次のように入力した場合:

echo Variable "$var" is not initialised.

そして

echo "Variable $var is not initialised."

フロントエンドの結果は(少なくとも私が知っている限り)まったく同じです。しかし、そのecho観点から、コマンドの実行方法に違いがあるかどうかを知りたいです。

echoすべてのパラメータが一度に受信されるので、パフォーマンスの観点から後者が速くなりますか?

ベストアンサー1

存在する

echo Variable "$var" is not initialised.

echo5つの引数を(計算する場合は6つ)渡すechoと、空白文字で区切られて出力され、改行文字で終了します。argv[0]echo

存在する:

echo "Variable $var is not initialised."

1つのパラメータを渡します(計算すると2つecho)。

この特別なケースとほとんどの場合、これは機能的に同じです。

2つ目は、シェルがコマンドを解析して実行する前に引数に格納する作業が少なく、引数を確認するecho作業が少ないことを意味します。echo

これはパフォーマンスに大きな違いをもたらす可能性はありません。私のテストでは、いくつかのecho/組み合わせ(組み込みのようshellな)ではわずかな違いがありましたが、他の組み合わせではほとんど違いはありません。bash

複数のパラメータの代わりに1つのパラメータを渡す他の理由は次のとおりです。

  • 引数の間に複数の空白が必要な場合に出力されecho a bます。出力がa b必要です。echo 'a b'a b

  • echo "$opt" is an invalid optionなどの一部のecho実装(echo組み込みなど)では、whileと一緒に(またはまたは...)を使用することbashはできません。opt=-e-E-neEecho "$opt is an invalid option"

  • 2つのパラメータ(最初のパラメータをecho foo bar除く)を渡すとき、各パラメータの長さは3バイトです。つまり、2つのポインタ(64ビットシステムではポインタあたり8バイト)と8バイト(実際の文字列の文字列区切り文字を含む)なので、合計の長さは次のようになります。 64ビットシステムでは24バイトです。echo\0

    ポインタであり、8バイトecho 'foo bar'(合計16バイト)です。これechoにより、多数のパラメータを含む外部実行可能ファイルを呼び出すと、パラメータサイズの制限に早く到達することができます(ただし、Linuxには単一パラメータの最大サイズ(128KiB)に制限があります)。

とにかく、ランダムなデータ(たとえば、$var内容がわからないデータ(ただし、ここでは文脈に数字と下線のみが含まれていることがわかります))の場合は、代わりに次のものをprintf使用したいと思いますecho

printf >&2 '%s\n' "Variable $var is not initialised."

または:

printf >&2 'Variable %s is not initialised.' "$var"

(これはユーザーにエラーとして表示され、スクリプトによって生成された通常の出力の一部ではないため、ここからstderrに送信されます。)

この場合、フォーマットに加えてに渡す必要がありますprintf

このアプローチのもう1つの利点は、メッセージをユーザーの言語に翻訳し、サポートされているすべての言語Variable %s is not initialised.でその形式で事前に作成された翻訳を提供できることです(そしてそれを検索するにはgettextksh93 / bashを使用してください)。$"..."

おすすめ記事