Bashなどのシェルスクリプトを書いていると、次のような2つの書き方を見かけることがあります。
$name
${name}「nameを参照しているだけなのに、なぜ{}を付けるのか?」
と疑問に思ったことはないでしょうか。
結論から言うと、単純に変数の値を参照するだけなら、どちらでも使えるケースが多いです。
しかし、変数名の境界を明確にしたい場合は${}が重要になります。
この記事では、シェルスクリプトにおける$nameと${name}の違いを、実例を使って解説します。
1. 基本的な変数の使い方
まず、シェルで変数を定義してみます。
name="Taro"変数を参照する場合は、次のように書けます。
echo $name実行すると、
Taroと表示されます。
${}を使っても同じ結果になります。
echo ${name}こちらも、
Taroと表示されます。
このような単純なケースでは、
$nameと
${name}の違いは分かりにくいでしょう。
2. では、なぜ${name}という書き方があるのか?
ポイントは、変数名の終わりをシェルに明確に伝えることです。
例えば、次のようなコードを考えてみます。
name="Taro"
echo "$name-san"
一見すると、
Taro-sanと表示されそうです。
しかし、シェルは$name-sanを、
$nameと
-sanに分けて認識します。
この場合は期待どおり動作します。
ところが、次のように変数の直後に英数字が続くと問題になります。
3. 変数の後ろに文字を続ける場合
例えば、変数nameの後ろに123を付けたいとします。
name="Taro"
echo "$name123"「Taro123」と表示したいところですが、シェルはname123を1つの変数名として解釈します。
つまり、
$name123は、
変数「name123」の値
を意味します。
nameという変数の値に123を追加したい場合は、${}を使います。
name="Taro"
echo "${name}123"実行結果:
Taro123ここで${name}の意味が分かりやすくなります。
${name}123と書くことで、
変数 → name
文字列 → 123
という境界を明確にできます。
4. ${}は「ここまでが変数名」という目印
例えば、
name="Taro"
echo "${name}さん"と書いた場合、
${name}
が変数で、
さん
が通常の文字列です。つまり、
"${name}さん"
は、
変数nameの値 + 「さん」
という意味になります。
同じように、
"${name}_data"なら、
Taro_dataとなります。
このように、変数と文字列をつなげる場合に${}が便利です。
5. $nameと${name}の使い分け
基本的には、次のように考えると分かりやすいでしょう。
単純に変数を参照する
name="Taro"
echo "$name"この場合は$nameで問題ありません。
変数の直後に英数字を続ける
echo "${name}123"この場合は${name}を使います。
変数と文字列を明確に区切る
echo "${name}_data"このような場合も${name}が分かりやすいです。
6. かっこを付けると何が変わるのか?
ここで重要なのは、${name}の{}が単なる飾りではないということです。
シェルは$の後ろに続く文字から変数名を判断します。
そのため、
${name}123と書けば、
nameという変数 + 123
と明確に指定できます。
7. さらに便利な${}
${}には、単に変数名の境界を明確にするだけではありません。
Bashでは、${}を利用してさまざまな変数展開ができます。
例えば、変数が設定されていない場合のデフォルト値を指定できます。
echo "${name:-Guest}"nameが設定されていればその値を使い、設定されていなければGuestを使います。
例えば、
name="Taro"
echo "${name:-Guest}"なら、
Taroとなります。
一方、
unset name
echo "${name:-Guest}"なら、
Guestとなります。
このように、${}は単なる「かっこ付きの変数」ではなく、Bashの変数展開を利用するための重要な構文でもあります。
8. ダブルクォートも重要
変数を扱うときには、${}だけでなくダブルクォートも重要です。
例えば、
echo "$name"や、
echo "${name}"のように書くことができます。
特に、変数に空白などが含まれる可能性がある場合には、変数展開をダブルクォートで囲む習慣を付けておくと安全です。
message="Hello World"
echo "$message"変数展開では、
$nameと
${name}だけを見るのではなく、
"$name"と
"${name}"という形も覚えておくとよいでしょう。
まとめ
単純な変数参照なら、
echo "$name"で十分です。
一方、変数の直後に文字を続ける場合は、
echo "${name}123"のように${}を使うことで、どこまでが変数名なのかを明確にできます。
さらに${}を使うと、
${name:-Guest}のような高度な変数展開も利用できます。
そのため、
「単純な参照なら
$name、変数名の境界を明確にしたいなら${name}」
と覚えておくと、シェルスクリプトを書くときに理解しやすくなります。
ここまで読んでいただき、ありがとうございます。もしこの記事の技術や考え方に少しでも興味を持っていただけたら、ネクストのエンジニアと気軽に話してみませんか。
- 選考ではありません
- 履歴書不要
- 技術の話が中心
- 所要時間30分程度
- オンラインOK