変数の拡張と変数の印刷(例:echo
または)printf
の違いは何ですか?
私が正しく理解したら、変数(対応する値)を印刷するのは単なる例です。拡大するそれ。おそらくその価値を置き換えるまた例です。
修正する
「変数拡張」という用語について簡単に定義してください。君の言葉で教えて、違いを説明する直前。
答え1
拡張と印刷は異なるジョブです。拡張カバーシェルがコマンドを処理するステップ数:Bashでは、中括弧拡張({1..5}
これ1 2 3 4 5
)、チルダ拡張(適切になる~user
)/home/user
、シェル引数拡張(${variable}
変数値で置き換え)、コマンド置換、算術拡張、プロセス置換、トークン化、およびファイル名拡張が可能です。 (あなたも見ることができますPOSIXワード拡張.)
拡張という用語の全てのこれらの用途の1つの可能な説明は、全てコマンド拡張につながることができることである。つまり長くなります(これはCでシェルを開発するときに特に考慮する必要があります)。
あなたの場合、拡張はパラメータ拡張です。
echo "${variable}"
~になる
echo "value"
あなたが言った変数を置き換えた後
echo value
引用符を削除して(少し単純化)、echo
印刷します。 Justecho
とprintf
はシェルに組み込まれているため、シェルのみが含まれていますが、ステップは分離されており、状況は外部コマンドと同じです。
したがって、印刷は拡張の特別なケースではありませんでした。ただし、リンクされた質問に示すように、交換については次を参照してください。バッシュマニュアルもっと学ぶ。
答え2
たとえば、シェルの機能を見てみましょう。
- ユーザー入力を待ちます
- ユーザー入力の解釈
- ユーザー入力に応じたアクション
- 他のプログラム/プロセスと通信
もちろんあります。
- データを画面に印刷
...実際にはターミナルまでです。それにもかかわらず、シェルはユーザーがデータを見ることができるようにアクションを実行します。
シェルがすることは変数を拡張するだけです。ユーザー入力を解釈するとき。シェルは、ユーザーが変数を参照したことを認識し、ユーザー入力が参照ではなく変数の内容を含むようにユーザー入力を解釈します。たとえば、FOO
値を格納する変数があるとしますbar
。ユーザーはステートメントを入力しますecho $FOO
。シェルはステートメントの解釈を開始し、それを指定$FOO
された変数への参照として認識し、ユーザーがFOO
入力したようにステートメントを解釈し続けますecho bar
。
印刷変数はその内容を投影するユーザーが認識できる方法(読み取りなど)。変数に格納された値をユーザーに渡すために処理する実際の操作を実行します。例では、echo $FOO
変数がFOO
最初に展開され、次に拡張の結果としてecho
ルーチンがコンテンツをFOO
画面に印刷します。
ある意味では、値を印刷することは変数を拡張するのとは反対です。変数が展開されるとシェルがデータを読み込んでいます何をすべきかを決めるため。変数を印刷するとき、シェルがデータを配布しています。、ユーザーに。
答え3
簡単に言えば、変数を拡張するとその値が置き換えられ、その変数はシェルコマンドまたはスクリプトの一部として使用できます。
echo
printf
文字列を標準出力(通常画面)に印刷する特定のコマンドです。文字列は、拡張シェル変数、文字列リテラル、または他のコマンドまたはコマンドセットの出力です。
したがって、ご覧のように全く異なります。変数を印刷せずに拡張することも、拡張変数以外のものを印刷することもできます。
答え4
シェルは、影響を受けたコマンドを実行する前に変数拡張を実行します。これはコマンドとは何の関係もありません。コマンドでもecho
別のprintf
コマンドでもかまいません。
たとえば、
param='-ltr'
ls $param
次に展開
ls -ltr
実行されるコマンドです。