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=""
----ここから答え----
$ echo $p "$p" '$p'
pen pen $p
$ echo "This is a ${p}cil" 'That is a $p.'
This is a pencil That is a $p.
$ 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 .
$ 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
...
$ grep $re /etc/passwd
止まった...
1.1.2. 補足
#3
について
That is a $pcil.
は Bashはpsil
が変数だと解釈する。
psil
という変数は定義されていないので、Bashはこれを空文字に置き換える。
- 防ぎたければ、
That is a ${p}cil.
とすればOK
#4-1
について
grep "" /etc/passwd
が実行される
#4-2
について
grep /etc/passwd
が実行される
- 不適切な形で引数が渡されることになるので、grepは止まる。
- Ctrl-Cで復帰
- 変数はなるべく
""
で囲っておくべし