簡単にするために、次のコードを参照してください。
#!/bin/bash
number=7
function doSomething() {
number=8
}
doSomething
echo "$number"
印刷されます8
。
しかし、一緒に:
#!/bin/bash
number=7
function doSomething() {
number=8
}
$(doSomething)
echo "$number"
印刷されます7
。
次の質問があります。
- 何ですか技術名それぞれについて? 、私の言葉は
functioncall
、$(functioncall)
- 各方法はどのように機能しますか?前者は関数自体の外部の変数を考慮(影響)するのに対し、後者はそうではないようです。
- ある方法を他の方法よりも強制する必要がある場合(主にパフォーマンスの問題について - もちろん - ある場合)、他の理由がある場合は歓迎します。
答え1
あなたは命令の置き換えの微妙さを経験しています。
電話
doSomething
単純な関数呼び出しです。関数のコマンドを呼び出した場所にコピーして貼り付けたかのように関数を実行します。したがって、number
変数は新しい値で上書きされます8
。
電話
$(doSomething)
一方、コマンドの置き換え。その目的は機能を実行することです。関数が印刷する内容を返します。 stdout
。通常、「スタンドアロン」として使用されず、変数割り当て内で使用されます。
os_type=$(uname)
これにより、Linuxシステムがコンソールにuname
印刷され、結果がシェル変数に保存されるコマンドが実行されます。したがって、何も出力しないコマンドや関数を使用してください(たとえば、あなたのようなものです。実際、置換はデフォルトで出力のプレースホルダなので、スクリプトエラーが発生しない唯一の理由は、関数が出力しないことです。 、何でも言いましたか?Linux
os_type
doSomething
$(doSomething)
doSomething
$(uname)
変える
$(doSomething)
シェルはコマンドを実行しLinux
て生成を試みます。
Linux: No such file or directory
エラー(1)。
観察している効果を理解する重要なポイントは、コマンドの置き換えにあります。このコマンドはサブシェルで実行されます。つまり、変数に対するすべての変更は、基本スクリプトを実行するシェルに逆伝播されません。したがって、内部的にコマンドを実行し、doSomething
変数をnumber
に設定している間は、独自のシェルプロセスで8
これを実行します。これは、スクリプトをstdout
検索する以外に、スクリプトを実行するシェルプロセスとは関係ありません。number
基本スクリプトで使用される変数は変更できません。
詳細については、以下を確認してください。
このウェブサイトまたは
詳細を確認してください。
(1)一方、これはコマンド置換を使用してスクリプトを作成するときに名前がわからないコマンドを実行することができますが、知っている他のコマンドを実行するとコマンドの名前を理解できることを意味します。 。