読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】echo で同じ変数を書いたのに、クォートの種類で結果が違う。シングル・ダブルクォートとバックスラッシュ【LPICレベル1】

17レスカテゴリ:Linux
1: 名無しさん

echo '$HOME' だと $HOME がそのまま出て、echo "$HOME" だと /home/user が出た
クォートの種類で何が変わるん?

2: 名無しさん

前提のおさらい。LPIC-1 は 101 と 102 の2つの試験で、101 の 103.1(コマンドラインでの作業)は重要度4。bash を前提にしてる

3: 名無しさん

>>1
まずコマンドの形から。コマンド オプション 引数 を空白で区切って打つ。たとえば ls -l /etc は ls がコマンド、-l がオプション、/etc が引数

4: 名無しさん

>>1
bash の man の QUOTING の節に3種類が書いてある
シングルクォート ' ':中の文字は全部そのまま。$ も展開されない
ダブルクォート " ":$ とバッククォートと \ は特別な意味が残る。だから変数は展開される
バックスラッシュ \:直後の1文字の特別な意味を消す

5: 名無しさん

>>4
実際に打つとこうなる
echo '$HOME' "$HOME" \$HOME
$HOME /home/user $HOME

6: 名無しさん

空白はどうなるん?

7: 名無しさん

>>6
クォートなしだと空白で引数が分かれて、続いた空白は1つにまとまる
echo "a b" a b
a b a b
前半はクォートの中だから空白2つが残って、後半は引数2つになって echo が空白1つでつないだ

8: 名無しさん

>>4
シングルクォートの中にシングルクォートは書けるん?

9: 名無しさん

>>8
書けない。シングルクォートの中では \ も効かない。いったん閉じて、ダブルクォートで囲んだ ' をつなぐ
echo 'it'"'"'s' → it's

10: 名無しさん

>>4
ダブルクォートの中で \ が効くのは、後ろが $・バッククォート・"・\・改行のときだけ
echo "\$ \" \\ x" → $ " \ x

11: 名無しさん

>>4
行の終わりの \ は「次の行に続く」の意味になる。長いコマンドを折り返すときに使う

12: 名無しさん

>>3
1行に複数のコマンドを書くには?

13: 名無しさん

>>12
; で区切ると、前のコマンドの成否に関係なく左から順に実行する
cd /tmp ; ls

14: 名無しさん

>>13
前が成功したときだけ次を動かす &&、失敗したときだけ動かす || もある。こっちは終了ステータスで分ける書き方で、範囲としては 105.2(スクリプト)に入ってる

15: 名無しさん

>>4
* もクォートすると展開されへんのか

16: 名無しさん

>>15
そう。echo * はファイル名に展開されて、echo '*' は * のまま。find や grep にパターンを渡すときにクォートするのはこのため

17: 名無しさん

>>5
変数を使うときは基本ダブルクォート、そのまま渡したいときはシングル、1文字だけならバックスラッシュ、で覚えるわ

管理人のひとこと