このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
Linuxコマンドの基本:シェルスクリプトのコマンド置換

シェルスクリプトのコマンド置換
シェルスクリプトを書いていると、コマンドの出力結果をスクリプト内で利用したい場面があります。そのような場合に便利なのがコマンド置換です。コマンド置換を使用すると、コマンドの実行結果を文字列として取得し、変数に代入したり、他のコマンドの引数として利用したりできます。

コマンド置換の基本
コマンド置換は、$( )
の形式で使用します。括弧内に実行したいコマンドを記述すると、その部分がコマンドの標準出力で置き換えられます。
$(コマンド)
例えば、date
コマンドを使って現在の日付を取得し、それをスクリプト内で利用する方法を見てみましょう。
現在の日付を表示する例
user01@ubuntu:~$ date '+%Y-%m-%d'
2024-11-16
解説
date '+%Y-%m-%d'
:date
コマンドにフォーマットを指定し、YYYY-MM-DD
の形式で現在の日付を表示します。
コマンド置換を利用したスクリプトの作成
コマンド置換を使って、現在の日付を含むログファイルを作成するシェルスクリプトを作成します。
ステップ1:スクリプトの作成
user01@ubuntu:~$ nano datelog.sh
datelog.sh
の内容
#!/bin/bash
filename=$(date '+%Y-%m-%d')
touch "Log_${filename}.log"
解説
filename=$(date '+%Y-%m-%d')
:コマンド置換を利用して、現在の日付を変数filename
に代入します。touch "Log_${filename}.log"
:touch
コマンドで、Log_2024-11-16.log
のようなファイルを作成します。
ステップ2:実行権限の付与
user01@ubuntu:~$ chmod +x datelog.sh
解説
chmod +x datelog.sh
:スクリプトに実行権限を与えます。
ステップ3:スクリプトの実行
user01@ubuntu:~$ ./datelog.sh
ステップ4:作成されたファイルの確認
user01@ubuntu:~$ ls -l Log_2024-11-16.log
出力例
-rw-rw-r-- 1 user01 user01 0 11月 16 01:53 Log_2024-11-16.log
解説
ls -l
コマンドで、作成されたログファイルの詳細情報を表示します。- ファイル名に現在の日付が含まれていることが確認できます。
ダブルクォート内でのコマンド置換
コマンド置換は、ダブルクォート " "
の中でも有効です。これを利用すると、文字列の中にコマンドの実行結果を埋め込むことができます。
例:echo
コマンドで日付を表示
user01@ubuntu:~$ echo "Today is $(date '+%Y-%m-%d')."
Today is 2024-11-16.
解説
"Today is $(date '+%Y-%m-%d')."
:ダブルクォート内でコマンド置換を使用し、メッセージに現在の日付を組み込んでいます。echo
コマンドが、組み込まれた文字列を表示します。
バッククォートによるコマンド置換
コマンド置換には、バッククォート `
を使用する古い記法もあります。
例:バッククォートを使用したコマンド置換
user01@ubuntu:~$ echo "Today is `date '+%Y-%m-%d'`."
Today is 2024-11-16.
解説
`date '+%Y-%m-%d'`
:バッククォートでコマンドを囲むことで、コマンド置換を行います。
バッククォート記法の注意点
- 可読性の低下:バッククォートは視認性が低く、開始と終了の位置がわかりにくいことがあります。
- ネストの困難さ:コマンド置換の中にさらにコマンド置換を入れ子にする場合、バッククォート記法ではエスケープが必要で複雑になります。
推奨事項
$()
の使用を推奨:現在では、可読性と保守性の観点から$()
の形式が推奨されています。
不要なファイルの削除
作成したログファイルが不要な場合は、以下のコマンドで削除できます。
user01@ubuntu:~$ rm datelog.sh Log_2024-11-16.log
まとめ
- コマンド置換を利用すると、コマンドの実行結果をシェルスクリプト内で簡単に活用できます。
$( )
の形式を使って、コマンドの標準出力を取得し、変数に代入したり、他のコマンドの引数として利用できます。- ダブルクォート内でもコマンド置換は有効で、動的な情報を含むメッセージを生成できます。
- バッククォート記法は存在しますが、可読性と保守性の観点から
$()
の使用が推奨されます。
これらの知識を活用して、シェルスクリプトの機能をより一層引き出し、効率的なスクリプト作成に役立ててください。