1. 概要

複雑なシェルスクリプトがある場合、ロジックで他のコマンドの出力を使用する必要があることがよくあります。

このクイックチュートリアルでは、コマンド置換を使用してこれを行う方法を説明します。

2. 構文

まず、構文を見てみましょう。 歴史的な理由により、2種類の構文を使用できます

$(command) 

`command`

一貫性のない動作を解決するため、最初の形式をお勧めします。 また、はるかに読みやすくなっています。

コマンド置換によりサブシェルが生成されることに注意してください。

簡単な例を見てみましょう。

$ echo "Current path is ["$(pwd)"]"
Current path is [/home/baeldung]

これは、古い構文でも機能します。

$ echo "Current path is ["`pwd`"]"
Current path is [/home/baeldung]

この例では、pwdコマンドの出力が実際のコマンドに置き換わります。

では、フォーマットの違いは何ですか?

この例を考えてみましょう:

$ function different_syntax() {
    echo "Backticks ["`echo \\baeldung`"]"
    echo "Dollar ["$(echo \\baeldung)"]"
}

$ different_syntax
Backticks [baeldung]
Dollar [\baeldung]

The フォームはキャラクターが違う 。 具体的には、その後に続くと動作が異なります $ また

存在するディレクトリを指す変数があると考えてください。

$ function different_syntax() {
    dir="/home"
    echo "Backticks ["`ls \$dir`"]"
    echo "Dollar ["$(ls \$dir)"]"
}

$ different_syntax
Backticks [baeldung demo]
ls: cannot access '$dir': No such file or directory
Dollar []

最初のケースでは、 逃げない $ 文字と変数はその値に展開されます。

3. 引用と入れ子

基本的な構文を確認したので、いくつかの高度なシナリオを見てみましょう。

コマンド置換式でネストを使用できます。

$ function nesting() {
    current_folders=$(ls $(pwd))
    echo "Current folders in $(pwd) ["$current_folders"]"
}

$ nesting
Current folders in /home [baeldung demo]

まず、現在のパスがpwdコマンドに置き換わります。 次に、これを ls に渡し、式全体をその出力に置き換えます。 最後に、出力を変数に格納します。

二重引用符を使用する場合、Bashは単語の分割やファイル名の拡張を実行しません

$ function quoting() {
    for element in $(ls $(pwd))
        do 
            echo "["$element"]"
        done
}

$ quoting
[baeldung]
[demo]

この場合、現在のディレクトリ内のすべてのファイルを繰り返し処理します。

次に、ループで引用符を使用するとどうなるかを見てみましょう。

$ function quoting() {
    for element in "$(ls $(pwd))"
        do 
            echo "["$element"]"
        done
}

$ quoting
[baeldung demo]

単語の分割は発生しなかったため、1つの要素を繰り返し処理します。

便利なスニペットで終了しましょう:

$ ps -g $(ps -C firefox -o sid=)
  PID TTY          TIME CMD
 1652 ?        00:02:48 gnome-shell
 1815 ?        00:00:12 Xwayland
 2207 ?        00:00:09 ibus-daemon
 2214 ?        00:00:00 ibus-dconf
 2215 ?        00:00:02 ibus-extension-
 2217 ?        00:00:00 ibus-x11
 2232 ?        00:00:02 ibus-engine-sim
 2533 ?        00:09:36 firefox
 2670 ?        00:00:32 WebExtensions
...

それが何をするか見てみましょう。 まず、 ps コマンドを使用して特定のプロセスを検索し、そのセッションIDを出力します。

出力指定子の後に=を使用して、ネストされたコマンドのヘッダーを抑制します。

次に、この出力(セッションID)を使用して、この特定のセッションのすべてのプロセスを出力します。

4. 結論

このクイックチュートリアルでは、コマンド置換の使用方法を説明しました。

最初に、2種類の基本構文について説明し、それらの違いについて説明しました。

その後、コマンド置換ネスティングがどのように機能するかを確認しました。

最後に、引用符がコマンド置換の結果にどのように影響するかを説明しました。