このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:シェルスクリプトのクォーティング

シェルスクリプトのクォーティング

 シェルスクリプトを書く際、クォーティング(引用符の使用)は非常に重要な概念です。クォーティングを正しく理解し使いこなすことで、文字列の扱いや特殊文字の処理を正確に行うことができます。ここでは、シェルスクリプトにおけるクォーティングの基本と、その活用方法について詳しく解説します。

コマンド引数の分割とクォーティング

コマンド引数の基本的な分割

 bash シェルでは、コマンドの引数はスペースによって区切られます。例えば、次のコマンドは cat コマンドに2つのファイル名 file1file2 を渡しています。

$ cat file1 file2

解説

  • cat:ファイルの内容を標準出力に表示するコマンド。
  • file1file2:表示したいファイル名。

スペースを含む引数を指定する方法

 ファイル名や引数にスペースが含まれている場合、そのままでは複数の引数として解釈されてしまいます。このような場合は、クォーティングを使って引数を囲む必要があります。

クォーティングの使用例

  • シングルクォート ' を使用
$ cat 'secret file'
  • ダブルクォート " を使用
$ cat "secret file"

解説

  • クォートで囲むことで、スペースを含む文字列全体が1つの引数として扱われます。

実際の例:スペースを含むファイル名の扱い

ステップ1:ファイルの作成

user01@ubuntu:~$ echo "This is a secret document." > "secret file"

解説

  • echo "This is a secret document." > "secret file""This is a secret document." という文字列を "secret file" という名前のファイルに書き込んでいます。
  • >:出力リダイレクトを行い、標準出力をファイルに書き込みます。

ステップ2:ファイルの内容を表示

user01@ubuntu:~$ cat 'secret file'
This is a secret document.
user01@ubuntu:~$ cat "secret file"
This is a secret document.

解説

  • 'secret file'"secret file" とクォートで囲むことで、スペースを含むファイル名を正しく指定しています。
  • cat コマンドがファイルの内容を表示します。

メタ文字とクォーティング

メタ文字の扱い

 シェルには特別な意味を持つ文字、メタ文字があります。例えば、* はワイルドカードとして使われ、ファイル名のパターンマッチングに利用されます。これらのメタ文字を文字列として扱いたい場合、クォーティングを使用します。

例:メタ文字を含む引数をクォートする

ステップ1:sample.txt ファイルの作成

user01@ubuntu:~$ cat << EOF > sample.txt
> Cool
> Coool
> Col
> Coal
> Co*l
> EOF

解説

  • cat << EOF > sample.txt:ヒアドキュメントを使用して、複数行のテキストを sample.txt に書き込んでいます。
  • EOF:入力の終了を示すマーカーです。

sample.txt の内容

user01@ubuntu:~$ cat sample.txt 
Cool
Coool
Col
Coal
Co*l

ステップ2:grep コマンドでパターンを検索

user01@ubuntu:~$ grep 'Co*l' sample.txt
Cool
Coool
Col

解説

  • 'Co*l':シングルクォートで囲むことで、シェルが * をワイルドカードとして解釈するのを防ぎ、grepコマンドの引数として扱われるようにします。
  • grep コマンドは正規表現としてパターンを解釈し、Co の後に任意の個数の o が続き、最後に l がある行を検索します。

クォーティングの効果

  • クォーティングすることで、シェルによるメタ文字の解釈を防ぎます。
  • 引数全体が一つの文字列として扱われます。

クォート中の変数展開

 クォートには シングルクォート 'ダブルクォート " の2種類があります。これらは以下のように動作が異なります。

シングルクォート '

  • 変数展開を行わない$ を含めても、そのまま文字列として扱われます。
  • メタ文字も文字列として扱う:シェルのメタ文字を無効化します。

ダブルクォート "

  • 変数展開を行う$変数名 がその値に置き換えられます。
  • 一部のメタ文字は有効$`(バッククォート)、\ などは特別な意味を持ちます。

例:シングルクォートとダブルクォートの違い

ステップ1:quote.sh の作成

user01@ubuntu:~$ nano quote.sh

quote.sh の内容

#!/bin/bash
country=Japan
echo 'I was born in $country'
echo "I was born in $country"

解説

  • country=Japan:変数 country に文字列 Japan を代入しています。
  • echo コマンドでシングルクォートとダブルクォートを使ってメッセージを表示します。

ステップ2:実行権限の付与

user01@ubuntu:~$ chmod +x quote.sh

解説

  • chmod +x quote.shquote.sh に実行権限を付与します。

ステップ3:スクリプトの実行

user01@ubuntu:~$ ./quote.sh
I was born in $country
I was born in Japan

解説

  • シングルクォートの場合'I was born in $country' は変数展開が行われず、文字列 $country がそのまま表示されます。
  • ダブルクォートの場合"I was born in $country" は変数 country が展開され、Japan が表示されます。

エスケープシーケンスの使用

 ダブルクォート内で特殊文字をそのまま表示したい場合、バックスラッシュ \ を使ってエスケープします。

例:ダブルクォート内でのエスケープ

echo "I was born in \$country"

解説

  • \$country:$ をエスケープすることで、変数展開を防ぎ、文字列 $country をそのまま表示します。

スクリプトの修正と実行

ステップ1:quote.sh の修正
user01@ubuntu:~$ nano quote.sh

修正内容

#!/bin/bash
country=Japan
echo 'I was born in $country'
echo "I was born in \$country"
ステップ2:スクリプトの実行
user01@ubuntu:~$ ./quote.sh
I was born in $country
I was born in $country

解説

  • ダブルクォート内で「\$country」とエスケープすることで、シングルクォートと同じ出力になります。

不要となったファイルの削除

user01@ubuntu:~$ rm 'secret file' sample.txt quote.sh 

クォーティングのまとめ

クォート種類記述方法変数展開メタ文字の解釈用途
シングルクォート'無効無効文字列をそのまま表示したい場合
ダブルクォート"有効一部有効変数展開を行いたい場合
エスケープシーケンス\(バックスラッシュ)--特定の文字の解釈を無効にしたい場合

ポイント

  • シングルクォート:変数展開やメタ文字の解釈を完全に無効化します。
  • ダブルクォート:変数展開は有効ですが、メタ文字の一部(例えば $`"、\)は特別な意味を持ちます。
  • エスケープシーケンス:特殊な意味を持つ文字の解釈を無効化できます。

まとめ

  • クォーティングを使用して、スペースやメタ文字を含む文字列を正しく扱うことができます。
  • シングルクォートとダブルクォートの違いを理解し、用途に応じて使い分けましょう。
    ・シングルクォート ':変数展開や特殊文字の解釈を行わない。
    ・ダブルクォート ":変数展開を行い、一部の特殊文字は解釈される。
  • エスケープシーケンスを使って、ダブルクォート内で特殊文字の解釈を無効化できます。
  • 正しいクォーティングの使用は、シェルスクリプトの信頼性と可読性を向上させます。

 これらの知識を活用して、シェルスクリプトで文字列を正確に扱い、意図した動作を実現しましょう。