クォートって何?
クオートとは「特殊文字の意味を無効化すること」です。
クオートには
- ダブルクオート 「”」
- シングルクオート 「’」
- バックスラッシュ 「\」
などがあります。
バッククォート「`」は似てますが上記とは別の意味があります。
特殊な文字をただの文字にするのがクォートの仕事
bashなどのシェル中では特別な意味をもつ記号がたくさんあります。
例えばアスタリスク「*」は0文字以上の任意の文字を表します。
file.txtやhoge.txtの両方を意味する文字列として「*.txt」とかけます。
このアスタリスクはそのままでは特殊記号として処理されるのでecho でアスタリスクを画面出力しようとしても思った挙動にはなりません。
# echo "test"
test
# echo *
bin etc games include lib lib64 libexec local sbin share src tmp
ここでクオート出番です。
・ダブルクオート
# echo "*"
*
・シングルクオート
# echo '*'
*
・バックスラッシュ
# echo \*
*
どのクオートを使ってもアスタリスクはただの文字化してechoで画面出力できます。
次にクオートが複数種類がある理由をお伝えします。
違いはクオートの範囲です
バックスラッシュ
バックスラッシュは一文字をクォートするのに利用します。
$ cat file
*********file********
$ cat file | grep *
このgrepの*はワイルドカード(特殊な文字)として認識されている
$ cat file | grep \*
*********file********
-> バックスラッシュで*をクォートすると*はただの文字として認識されている。
一文字だけクオートしたい時はバックスラッシュを使いましょう。
ダブルクォートとシングルクォート
ダブルクォートとシングルクォートは囲んだ間の文字をクォートできます。
シングルクオートとダブルクオートの違いはクォート可能な文字列の範囲の違いです。
シングルクオート > ダブルクォート
シングルクォートは最強で基本的にどんな特殊文字もただの文字に変えます。
一方でダブルクォートは 「$」,「 `」, 「\」はクォートできません。
クォートの使い道を紹介
上で紹介した「特殊文字→ただの文字」以外の使い道としては、その逆、「ただの文字になってしまった特殊文字→特殊文字に復帰」のパターンがあります。
バッククォートを入れ子にして使う(ネストする)
バッククォートは囲まれた部分をコマンドとして実行します。
ただ、ダブルクオート中でクオートされているとバッククォートがただの文字として出力されてしまうのでバックスラッシュで逆クオートすると特殊文字に戻せます。
#!/bin/bash
variable=` echo "today is \`date\`"`
echo "${variable}"
実行すると
today is 2022年 7月 7日 木曜日 02時24分04秒 JST
これはvariable変数にechoの内容を入れているが、バッククォートの中にはdateコマンドとechoコマンドが二つ実行されています。
まず、dateコマンドが実行され、dateの内容が入った後に、echoで出力されています。
ただし、バッククォートによるコマンド実行は$(コマンド)に置き換えられているのでこちらを利用することもできます。
#!/bin/bash
variable=` echo "today is $(date)"`
echo "${variable}"
実行すると
today is 2022年 7月 7日 木曜日 02時24分04秒 JST
実行結果は変わらず同じものが出力されています。
シングルクオート中で変数展開したい
シングルクオートは全てを文字化してしまう最強のクオートなのでシングルクオート中に変数を展開したくても文字として認識されます。
どういうことか?は具体例を見た方がわかりやすいと思います。
・変数としてvariableに10を代入
# variable=10
変数をecho
# echo ${variable}
10
→値の10が出力
# echo "${variable}"
10
→ダブルクオートで囲っても$などはクオートされない
# echo '${variable}'
${variable}
→ただしシングルクオートでは文字化されてそのまま出力される。
・もっと長い文章に変えてみる
# echo "value of ${variable}"
value of 10
# echo 'value of ${variable}'
value of ${variable}
# echo 'value of "${variable}"'
value of "${variable}"
ダブルクオートで囲ってみてもシングルクオート中ではダブルクオートもただの文字列になるので意味なし
# echo 'value of' "${variable}"''
value of 10
→ただし、シングルクオートを途中で閉じて変数の部分を過ぎたら再度シングルクオートでかこうようにすれば変数はきちんと展開されます。