Shellスクリプト

【Shellスクリプト】クォートとは?コマンド置換とは?実現方法と内容の違いについて!

2020年4月10日

テスト中など、名前に唯一性のあるファイルを複数個保持したいケースがあります。そんな時、自動でタイムスタンプをつけたり、ファイル名に変数を使えれば便利ですが、これには各種クォートによる装飾が必要です。

ここではクォートの機能と使い方を見ていきます。

クォートとは

文章においてはいわゆる引用符ですが、シェルスクリプトにおいては、囲まれた内容について特別な処理を行います。

クォートは以下の3つに分かれます。

3つのシェルのクォート

  • シングルクォート 「’ ’」
    囲んだ内容をそのままの文字列として出力。
  • ダブルクォート   「””」
    囲んだ内容に変数がある場合は中身を展開し、文字列として出力
  • バッククォート   「``」
    囲んだ内容のコマンドを、同じ行の他のコマンドより先に解釈して実行する

バッククォートに関しては、前半2つのクォートと用途がやや異なり、コマンドに用います。

それぞれ見ていきましょう。

シングルクォート「’」

シングルクォートで囲まれた中身はすべてそのままの文字列として出力されます。これがシェルのクォーテーションの中では一番強力なものになります。

内部に変数が含まれている場合でも、すべてエスケープされて中身は展開されません。

シングルクォートでもエスケープ出来ないのは、このシングルクォートだけになります。

シングルクォート「’」とバッククォート「`」は取り違えないように注意しましょう。見た目は似ていますが機能は全く異なります。

なお、シングルクォートの中にシングルクォートがある場合、エスケープされて通常表示されません。なんのこっちゃ?・・

# シングルクォートで囲まれたシングルクォート
echo ' ' '

つまり、上記の例のような「’(シングルクォート)」で囲まれた「(シングルクォート)」は、文字列として認識できないと言う事です。

上記の場合、クォートのミスマッチが起きてしまい、シェルが認識できる書式にならないのです。解決するには、「\バッククォート)」によるシングルクォートのエスケープを使用します。「\バッククォート)」については、後程解説します。

ダブルクォート「”」

ダブルクォートは、ほとんどの特殊文字の意味をエスケープし、文字として扱います。

「”(ダブルクォート)」の場合は、シングルクォートと異なり、内部に変数が存在する場合はそれを展開して文字列を出力します。

「‘(バツククォート)」、「\(バックスラッシュ)」等の特殊文字はダブルクォートで囲んでも、エスケープすることは出来ません。エスケープが必要な場合は「’(シングルクォート)」で囲みます。例)「echo ' / '」

バックスラッシュ(\)

クォートとは異なりますが、シングルクォートの項目でも説明したように、シングルクォート内のシングルクォートは表示されないため、「Test 'is' done」のような文字列を出力する時には、工夫が必要です。

このような時にはバックスラッシュ(\)を使い、シングルクォート直前につければ出力させることが出来ます。しかし以下の例のように少し複雑に書くことになります。

$ echo 'Test '\''is'\'' done'

「\(バックスラッシュ)」は次の特殊文字をエスケープして、普通の文字として扱います。

シェルスクリプトでは、特にこの「\(バックスラッシュ)」によるエスケープ処理は、多用することが多いので頭の片隅に置いておきましょう。

コマンド置換とは

コマンド置換とは、ある行の他のコマンドよりも先行して別のコマンドを実行したいときに行う処理で、先述したバッククォートか、$(command)の形でコマンドを囲んで記述することで実現する事が出来ます。

例えば、サーバー名を末尾に持つファイルを作りたい時には以下のようなコマンドを実行します。

$ touch "file_`uname -n`"
または
$ touch "file_$(uname -n)"

上記コマンドを実行した場合、作られるファイル名はいずれも「file_<ホスト名>」と言うファイルが作成されます。それぞれの記述の違いを見ていきましょう。

バッククォート「`」によるコマンド置換

先の例で出したように、バッククォートでコマンドを囲むことで記述します。

$ DATE=`date`
$ echo $DATE

バッククォートはネストする事が可能ですが、2つ以上の場合はその分だけバックスラッシュを入れ子にしたエスケープが必要です。

$ echo "aaa `echo bbb \`echo ccc\``"

もし複数回ネストしたい場合は、次に示す$()での記述が簡潔で良いでしょう。

「$()」によるコマンド置換

バッククォートの場合と同様に、コマンドを"$("と")"の記号で囲むことで記述します。ネストしたい場合はエスケープは用いず、単純に$()を内側に書けば実現できます。

いわば「$( )」は、バッククォートの代替機能となります。「上位互換」と言っても過言ではありません。

コマンドの書式

$( コマンド )

# $()によるコマンド置換
$ echo "aaa $(echo bbb)"

# $()によるネストコマンド置換
$ echo "aaa $(echo bbb $(echo ccc))"

クォートやコマンド置換は組み合わせて使用可能なため、状況に応じて簡潔な記述で意図を達成するよう心掛けましょう。

「`(バッククォート)」は古い形式であり、「’(シングルクォート)」と非常に紛らわしいため、可能なら「$( )」を積極的に使用していきましょう。なお「‘(バッククォート)」と「$( )」の機能に差はありません。

よく読まれている記事

1

目次1 Shellとは?1.1 代表的なシェルの種類2 シェルスクリプトの違いとは? Shellとは? Shellとは、人間の理解できる言葉を機会へ伝えるプログラムです。 Linux環境でコマンドプロ ...

2

Linuxは主にサーバー用として利用されるOSです。大規模な基幹システムの開発者、ロボットや家電開発等の組み込み系エンジニア、ネットワーク機器やデータベースに携わるインフラエンジニアは触れることが多い ...

3

プログラミング言語を習得しようと思った時、必ずと言っていいほど候補として挙げられるのが「Java」というプログラミング言語です。 「Java」は、現在日本で最も使われている言語であり、非常に人気のある ...

4

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-Shellスクリプト

Copyright© Beエンジニア , 2020 All Rights Reserved.