シェルワンライナー #2.1.e クォートと変数

1. 2.1.e. クォートと変数

  • awkを使う際に引数に与えるAWKコードを シングルクォート('') で囲っていたが、これには2つ意味がある
    • {print 1+1}の様に空白の入った引数を一つにまとめて引き渡し
      • {printと1+1} の2つの引数として渡さない
    • $1 などのAWKの変数が、シェルの変数として解釈されることを防止
  • 特殊な場合を除き、Bashでは ''で囲われた文字に手を加えない
  • 逆にいうと、引数にbashの変数を使いたいときはクォートしては駄目ということ
    • これだと困っちゃうのでダブルクォートで囲うクォートも用意されている""
    • ダブルクォートで囲うとその中のBashの変数は解釈される。
    • 変数以外の~(ホームディレクトリ)とかも解釈される
  • 話変わって、シェルスクリプトは変数を使うときに、ダブルクォートで囲うかどうかでシェルスクリプトの挙動が変わるパターンあり。
  • ${変数名}{}で変数名を囲う表記が用意されている

1.1. 練習問題

1.1.1. 問題と答え

----準備----
$ p=pen
$ re="" #←変数reの文字列は長さ0の空文字になる
----ここから答え----
#1
$ echo $p "$p" '$p'
pen pen $p
#2
$ echo "This is a ${p}cil" 'That is a $p.'
This is a pencil That is a $p.
#3
$ echo "This is a ${p}cil." That is a "$p"cil. "That was a $pcil."
This is a pencil. That is a pencil. That was a .
#4-1
$ grep "$re" /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
...
#4-2
$ grep $re /etc/passwd
止まった...

1.1.2. 補足

  • #3について
    • That is a $pcil.Bashpsilが変数だと解釈する。
    • psilという変数は定義されていないので、Bashはこれを空文字に置き換える。
    • 防ぎたければ、That is a ${p}cil. とすればOK
  • #4-1について
    • grep "" /etc/passwdが実行される
      • 検索語が空文字なので、全部ヒットする
  • #4-2について
    • grep /etc/passwdが実行される
      • 不適切な形で引数が渡されることになるので、grepは止まる。
      • Ctrl-Cで復帰
      • 変数はなるべく""で囲っておくべし