クォーテーションの使い分け(Bash)

Bashでの変数に対するクォーテーションの使い分けについて整理しました。

詳しい人にとっては当たり前の話かもしれませんが、知らなければ意識しないままになってしまうところではないかと思います。
(実のところ最近まで私も特に気にしていませんでした…)

以下3パターンでの動作の違いを見ていきます。

  • クォーテーションなし

  • シングルクォーテーション

  • ダブルクォーテーション


確認用の変数

test1="aaa"
test2=`ls -l | grep (絶対に存在しないファイル名)`

test1 はただの文字列、test2 はコマンドの実行結果として変数の中身が空になるようにしています。


クォーテーションなし

変数に格納された値がそのまま表示されます。

echo $test1

実行結果
aaa
echo $test2

実行結果(値は空)


シングルクォーテーション

変数名がそのまま文字列として表示されます。

echo '$test1'

実行結果
$test1
echo '$test2'

実行結果
$test2


ダブルクォーテーション

クォーテーションなしのときと同じく、変数に格納された値がそのまま表示されます。

echo "$test1"

実行結果
aaa
echo "$test2"

実行結果(値は空)


シングルクォーテーションのときと同じように変数名の文字列を表示するには、エスケープが必要になります。

echo "\$test1"

(実行結果)
$test1


クォーテーションなしとダブルクォーテーションの違い

echoで表示するだけでは違いがあるように見えませんが、その変数をif文で使うときなど、場合によっては注意が必要です。

クォーテーションなしで if の条件に使うとエラーになりますが、

if [ $test1 != $test2 ]; then echo "NOT EQUAL"; fi

(実行結果)
bash: [: aaa: unary operator expected

ダブルクォーテーションを付けると正常に動作するようになります。

if [ "$test1" != "$test2" ]; then echo "NOT EQUAL"; fi

(実行結果)
NOT EQUAL


まとめ

  • クォーテーションなし
    変数に格納された値がそのまま使われる。(変数を書いた部分が、その中身で置き換えられるイメージ)
    if の条件にするときなど、場合によっては上手くいかなくなる。

  • シングルクォーテーション
    変数ではなく、そのような文字列として扱われる。

  • ダブルクォーテーション
    変数に格納された値がそのまま使われるが、その内容はBashによって解釈される。

今回は文字列と空の値の場合について、3パターンを比較しましたが、コマンドとして解釈可能な文字列を入れたときの挙動など、状況によって適切な書き方は違ってくるので、きちんと仕組みを理解して使い分けられるのが理想的です。


この記事が気に入ったらサポートをしてみませんか?