【Linux】Shellは奥が深い | 夕湖津のブログ

夕湖津のブログ

問題解決に役立つ情報の提供を目指します

テーマ:

以下は、「入門 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 ←元のまま