Bash でコマンドの出力に変数を設定する
このチュートリアルでは、コマンド置換を使用して、コマンドの出力を bash の変数に割り当てる方法を示します。
Bash でのコマンド置換
コマンド置換は、Linux コマンドを実行し、コマンドの出力を bash 変数に格納できるようにする bash 機能です。コマンド置換構文を使用してコマンドが実行されると、コマンドの標準出力がコマンドを置き換え、末尾の改行が削除されます。
コマンド置換では、2つの異なる構文を使用して、コマンド出力を変数に格納します。
最初の構文タイプは、以下に示すように、コマンドを括弧内に配置し、先頭に $
記号を追加します。
括弧内のすべての文字は、コマンドの一部として扱われます。
output=$(command)
output=$(command argument-1)
output=$(/path/to/command)
output=$(/path/to/command argument-1)
2 番目のタイプの構文では、コマンドの前後にバッククォートを使用します。
output=`command`
output=`command argument-1`
output=`/path/to/command`
output=`/path/to/command argument-1`
Bash コマンドの変数への出力
次の例を使用して、bash スクリプトでのコマンド置換を示します。
以下では、最初に括弧とドル記号の最初の構文を使用します。whoami
コマンドが実行され、出力がコマンドに置き換わり、コマンドは user
変数に割り当てられます。echo
コマンドを使用して、メッセージを標準出力に表示します。
user=$(whoami)
echo "The logged in user is $user"
このスクリプトを実行すると、次の出力が表示されます。
The logged in user is delftstack
以下では、backticks 構文を使用します。whoami
コマンドの出力は user
変数に割り当てられ、echo
はメッセージを端末に出力するために使用されます。
user=`whoami`
echo "The logged in user is $user"
スクリプトを実行すると、以下の出力が表示されます。
The logged in user is delftstack
以下のスクリプトでは、ls
を使用して、括弧とドル記号の構文を使用して delftstack
フォルダーの内容を一覧表示します。ls
コマンドの出力は、files
変数に割り当てられます。echo
コマンドは、files
変数の内容を端末に出力するために使用されます。
files=$(ls -l delftstack)
echo "$files"
スクリプトを実行すると、次の出力が標準出力に出力されます。
total 4
-rw-r--r-- 1 fumba fumba 752 Nov 17 12:51 directory.sh
-rw-r--r-- 1 fumba fumba 79 Nov 19 13:11 foo1.sh
drwxr-xr-x 1 fumba fumba 4096 Nov 22 13:57 part
-rw-r--r-- 1 fumba fumba 213 Nov 21 21:10 regex.sh
以下の bash スクリプトは、backticks 構文を使用して ls
コマンドの出力を files
変数に割り当て、echo
コマンドを使用して files
変数の内容を標準出力に出力します。
files=`ls -l delftstack`
echo "$files"
スクリプトを実行すると、次の出力が表示されます。
total 4
-rw-r--r-- 1 fumba fumba 752 Nov 17 12:51 directory.sh
-rw-r--r-- 1 fumba fumba 79 Nov 19 13:11 foo1.sh
drwxr-xr-x 1 fumba fumba 4096 Nov 22 13:57 part
-rw-r--r-- 1 fumba fumba 213 Nov 21 21:10 regex.sh
次の構文を使用して、bash スクリプトの変数に複数行のコマンドを割り当てます。
variable_name=$(command \
argument 1 \
argument 2 \
argument 3)
以下の bash スクリプトは、複数行コマンドの出力を変数に割り当てる方法を示しています。ls
コマンドは現在のフォルダのすべての内容を一覧表示し、出力は head
コマンドにパイプされます。head
コマンドは、ls
からの入力の最初の 5
行のみを選択し、出力を grep
コマンドにパイプします。grep
コマンドは、行を flow
という単語と照合し、標準出力に出力します。
files=$(ls -l \
| \
head -5 \
| grep -i "flow")
echo $files
スクリプトを実行すると、次の出力が表示されます。
drwxr-xr-x 1 fumba fumba 4096 Sep 30 09:29 airflow