このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
Linuxコマンドの基本:シェルスクリプトのクォーティング
シェルスクリプトのクォーティング
シェルスクリプトを書く際、クォーティング(引用符の使用)は非常に重要な概念です。クォーティングを正しく理解し使いこなすことで、文字列の扱いや特殊文字の処理を正確に行うことができます。ここでは、シェルスクリプトにおけるクォーティングの基本と、その活用方法について詳しく解説します。
コマンド引数の分割とクォーティング
コマンド引数の基本的な分割
bash
シェルでは、コマンドの引数はスペースによって区切られます。例えば、次のコマンドは cat
コマンドに2つのファイル名 file1
と file2
を渡しています。
$ cat file1 file2
解説
cat
:ファイルの内容を標準出力に表示するコマンド。file1
とfile2
:表示したいファイル名。
スペースを含む引数を指定する方法
ファイル名や引数にスペースが含まれている場合、そのままでは複数の引数として解釈されてしまいます。このような場合は、クォーティングを使って引数を囲む必要があります。
クォーティングの使用例
- シングルクォート
'
を使用
$ 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.sh
:quote.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
クォーティングのまとめ
クォート種類 | 記述方法 | 変数展開 | メタ文字の解釈 | 用途 |
---|---|---|---|---|
シングルクォート | ' | 無効 | 無効 | 文字列をそのまま表示したい場合 |
ダブルクォート | " | 有効 | 一部有効 | 変数展開を行いたい場合 |
エスケープシーケンス | \(バックスラッシュ) | - | - | 特定の文字の解釈を無効にしたい場合 |
ポイント
- シングルクォート:変数展開やメタ文字の解釈を完全に無効化します。
- ダブルクォート:変数展開は有効ですが、メタ文字の一部(例えば
$
、`
、"
、\)は特別な意味を持ちます。 - エスケープシーケンス:特殊な意味を持つ文字の解釈を無効化できます。
まとめ
- クォーティングを使用して、スペースやメタ文字を含む文字列を正しく扱うことができます。
- シングルクォートとダブルクォートの違いを理解し、用途に応じて使い分けましょう。
・シングルクォート'
:変数展開や特殊文字の解釈を行わない。
・ダブルクォート"
:変数展開を行い、一部の特殊文字は解釈される。 - エスケープシーケンスを使って、ダブルクォート内で特殊文字の解釈を無効化できます。
- 正しいクォーティングの使用は、シェルスクリプトの信頼性と可読性を向上させます。
これらの知識を活用して、シェルスクリプトで文字列を正確に扱い、意図した動作を実現しましょう。