echo '$HOME' だと $HOME がそのまま出て、echo "$HOME" だと /home/user が出た
クォートの種類で何が変わるん?
【疑問】echo で同じ変数を書いたのに、クォートの種類で結果が違う。シングル・ダブルクォートとバックスラッシュ【LPICレベル1】
前提のおさらい。LPIC-1 は 101 と 102 の2つの試験で、101 の 103.1(コマンドラインでの作業)は重要度4。bash を前提にしてる
>>1
まずコマンドの形から。コマンド オプション 引数 を空白で区切って打つ。たとえば ls -l /etc は ls がコマンド、-l がオプション、/etc が引数
>>1
bash の man の QUOTING の節に3種類が書いてある
シングルクォート ' ':中の文字は全部そのまま。$ も展開されない
ダブルクォート " ":$ とバッククォートと \ は特別な意味が残る。だから変数は展開される
バックスラッシュ \:直後の1文字の特別な意味を消す
>>4
実際に打つとこうなるecho '$HOME' "$HOME" \$HOME$HOME /home/user $HOME
空白はどうなるん?
>>6
クォートなしだと空白で引数が分かれて、続いた空白は1つにまとまるecho "a b" a ba b a b
前半はクォートの中だから空白2つが残って、後半は引数2つになって echo が空白1つでつないだ
>>4
シングルクォートの中にシングルクォートは書けるん?
>>8
書けない。シングルクォートの中では \ も効かない。いったん閉じて、ダブルクォートで囲んだ ' をつなぐecho 'it'"'"'s' → it's
>>4
ダブルクォートの中で \ が効くのは、後ろが $・バッククォート・"・\・改行のときだけecho "\$ \" \\ x" → $ " \ x
>>4
行の終わりの \ は「次の行に続く」の意味になる。長いコマンドを折り返すときに使う
>>3
1行に複数のコマンドを書くには?
>>12; で区切ると、前のコマンドの成否に関係なく左から順に実行するcd /tmp ; ls
>>13
前が成功したときだけ次を動かす &&、失敗したときだけ動かす || もある。こっちは終了ステータスで分ける書き方で、範囲としては 105.2(スクリプト)に入ってる
>>4* もクォートすると展開されへんのか
>>15
そう。echo * はファイル名に展開されて、echo '*' は * のまま。find や grep にパターンを渡すときにクォートするのはこのため
>>5
変数を使うときは基本ダブルクォート、そのまま渡したいときはシングル、1文字だけならバックスラッシュ、で覚えるわ
管理人のひとこと
- コマンドは「コマンド オプション 引数」を空白で区切る。空白で区切られたものが別々の引数になり、続いた空白はまとまる。
- シングルクォートは中を全部そのまま(
\も効かない)。ダブルクォートは$・バッククォート・\の意味が残り、変数とコマンド置換は展開される。バックスラッシュは直後の1文字の意味を消し、行末なら次の行に続ける。 ;は順に実行、&&は成功したら次、||は失敗したら次。*などのワイルドカードもクォートすると展開されない。