以下は、「入門 UNIXシェルプログラミング 改訂第二版」(Bruce Blinn)より
■改行コードはコマンドのセパレーター
改行するとその前までの文字列をシェルが実行する
⇒ 実行させないでコマンドを継続させる場合は改行コードを無視させれば良い
⇒ 改行コードを無視させるのはバックスラッシュ「¥」
$ echo Hello \
> World.
Hello World.
空白を複数入れても結果は一つの空白になっているが、シェルは連続する空白とTABを1個の空白に置き換えるため
■ワイルドカード
ls [abc]*
で、a or b or cで開始されるファイルを探すが、ワイルドカードで隠しファイルを表示させるには
ドットを明示する必要がある
$ ls -ld .*
drwxrwxr-x 2 testuser testuser 44 9月 12 02:59 .
drwx------ 7 testuser testuser 203 9月 12 02:47 ..
-rw-rw-r-- 1 testuser testuser 0 9月 12 02:59 .kakushi
※lsのdオプション = ディレクトリの内容ではなく、ディレクトリ自身を表示させる+シンボリックリンクを辿らない
そこで下記を試すと、[ ]内にドットを入れているが、「.kakushi」がヒットしない
$ ls -l [.k]*
ls: [.k]* にアクセスできません: そのようなファイルやディレクトリはありません
その理由は、シェルは[ ]内で指定された文字で開始されるファイルを探す時に、
最初から隠しファイルを無視するため
■クォーテーション
クォーテーションとは、「シェルが特殊だと判断する文字の"特殊"の意味を剥奪すること」で、
3種類ある。(シングルとダブルの2種類ではない!)
1.バックスラッシュ
2.ダブルクオーテーション
3.シングルクォーテーション
※特殊文字とは下記
;
&
(
)
|
~
<
>
?
*
[
]
'
"
`
{
}
改行
タブ
スペース
1.バックスラッシュ
$ echo abc\\def
abc\def
これはよくある例。
では、下記は「\」が改行コードをクォートしているのか?
$ echo abc\
> def
abcdef
答えはNO.
バックスラッシュは、改行コードをないものとして扱っている。
よって、これは改行コードをクォートしているわけではない
次に、
$ echo abc\def
abcdef
これは、バックスラッシュの直後の文字が「d」で、特殊文字ではないため、なんのクォート機能も果たさないため、通常通りに表示されている
尚、改行をシェル変数に格納する方法は下記
$ KAIGYOU='
> '
$ echo $KAIGYOU
$
$ echo $KAIGYOU | od -c
0000000 \n
0000001
で、改行コードが入っていることが確認出来た
■シェル変数の初期設定
echo ${TEST=test} (コロンなし)
と
echo ${TEST:=test} (コロンあり)
の違いを一言で表現すると、
コロンなし → 「そのシェル変数が本当に初登場の時にだけセット」
コロンあり → 「そのシェル変数にまだ値がセットされていない時にセット」
★使い分けとして考えられるケース
コロンなしが分かり易い。初期値セットとして考えやすい。
よって、コロンありは使わない!(独自考察のため、良い子はマネをしないでね)
※カンケーないですが、PL/SQLはコロンありのみ
※以下の検証は分かりづらいです。
【コロンなし検証】
(1)初登場の場合にセットされること
$ echo ${TEST=test}
test ←「TEST」は初登場なので「TEST」に「test」がセットされて表示された
$ echo $TEST
test ←やはりセットされている
(2)1回でも登場していたらセットされないこと
$ HOGE=
$ echo ${HOGE=1}
←出力なし( = やはりセットされなかった)
$ echo $HOGE
←やはりセットされていない
【コロンあり検証】
(1)登場しているが値がセットされていない場合
$ FUGA= ←登場させるが値をセットしない
$ echo ${FUGA:=test}
test ← やはりセットされた
$ echo $FUGA
test ←確かにセットされている
(2)登場していて値がセットされている
$ FUGA=1 ←登場させて、値をセットする
$ echo ${FUGA:=2}
1 ←2はセットされなかった
$ echo $FUGA
1 ←元のまま