【特殊変数】Shell のメタキャラクタ

メタキャラクタを制するものはシェルを制すかはわかりませんが Shell の基本を知っておくと何かと役立ちます。

メタキャラクタについて

bash のメタキャラクタ一覧です。

文字 内容
& ampersand & はコマンドをバックグラウンド実行する. && は最初のコマンドの戻り値が 0 (成功) の場合に続くコマンドを実行する
; semicolon ; は同じラインでコマンドを連続実行する
` backquote ` は sub-shell を起動してコマンドを実行. ただしネストはできない
single-quotation ‘ ‘ 内のメタキャラクタは特殊ではないキャラクタとして認識する
double-quotation ” ” 内のメタキャラクタは特殊ではないキャラクタとして認識する
\ backslash \ はメタキャラクタを特殊ではないキャラクタとして使う
| pipe | は最初のコマンドの標準出力を続くコマンドの標準入力として実行する. || は最初のコマンドの戻り値が 0以外(失敗) の時に続くコマンドを実行する
~ tilde(チルダ) ~ はユーザの HomeDir を参照する ($HOME)
< > リダイレクション
( ) Parenthesess () は sub-shell を起動してコマンドを実行
[ ] bracket [] は test の糖衣構文. double bracket [[]] の場合, 正規表現やパターンマッチングが使える
{ } braces {} は 変数展開 / コマンドをカレントシェルで実行する

パイプ | は最初のコマンドの標準出力を受け取って続くコマンドの標準入力として実行します。

$ cmd1  | cmd2

; はコマンドの連続実行です。

$ cmd1; cmd2

& はコマンドをバックグラウンドで実行します。

$ cmd1 &

&& は最初の cmd1 の戻り値が 0 (成功) の場合に cmd2 を実行します。

$ cmd1  && cmd2

この && はソースコードからビルド・インストールする場合によく使われます。

$ ./configure && make && make install

|| は cmd1実行 の戻り値が 0以外(失敗) の時に cmd2 を実行します。

$ cmd1 || cmd2

続いてリダイレクション, まずは標準出力からです。

$ cmd1 > file
# append mode
$ cmd1 >> file
# stdout
$ ls 1> file
# stderr
$ ls 2> file
# stdout/sterr
$ ls &> file
# stdoutはfile, sterrはfile2
$ abc 1>file 2>file2

リダイレクションの標準入力です。

$ cmd1  < file 

標準出力よりは使用機会が少ない気もします。

$ cat < /etc/passwd | tail -3

シングルクォート, ダブルクォートは囲った変数の中身を文字列として扱います。文字列リテラル。

$ grep -R '文字列' *

`(バッククォート, アンサングラーブ) は囲った変数の中身をコマンドとして処理しその結果を出力します。

$ STR=`ls`
$ echo $STR

~ は実行ユーザの HomeDir を表します。

$ echo ~
/home/hoge

\n は文字リテラル中に用いると改行されます。

$ echo -e "hello\nworld"
hello
world

? は任意の1文字, * は任意の文字列でいわゆるワイルドカードを意味します。

特殊変数

特殊変数は以下のように $ + キャラクタ で表現されます。特殊変数はシェルスクリプト内で使用されることが多いです。

文字 内容
$#, $0-9, $@, $* コマンドラインの引数 ($@, $* は $0 以外の引数)
$? 直前のコマンドの終了ステータスを取得
$$ 現在のコマンドの PIDを取得
$- Shell にセットされているオプションを取得
$! バックグラウンドで実行された直前のプロセスのPIDを取得

シェルスクリプトの基本

シェルスクリプトの基本を確認します。以下のシェルスクリプト a.sh を書きます。
テキストエディタで作成したファイルの権限は, 通常 `-rw-r--r--` となります。 数値表現は 644 (r=4, x=2, x=1) になります。
ちなみにシェルスクリプトの先頭行の #!/bin/sh や #!/bin/bash は shebang と言います。
sh と bash は異なるので, bash の機能を使う可能性がある場合は明示的に bash を指定した方が良いと思います。

$ vim a.sh
#!/bin/bash

echo helloworld

$ ls -l a.sh
-rw-r--r--  1 xxx  staff  27  1 23 22:41 a.sh

bash コマンドで実行できますが, ./a.sh では実行権限がないので実行できません。

$ bash a.sh
helloworld

$ ./a.sh
-bash: ./a.sh: Permission denied

実行権限を与えると ./a.sh で実行できるようになります。

$ chmod u+x a.sh
$ ls -l a.sh
-rwxr--r--  1 xxx  staff  27  1 23 22:41 a.sh*

$ ./a.sh
helloworld

また, sh コマンドや bash コマンドに -x オプションを指定すると実行されたコマンドが表示され, 変数の値も確認できます。


[1] What are the special dollar sign shell variables?
[2] シェルスクリプトでの$@の罠
[3] bash 配列まとめ
[4] シェル芸初心者によるシェル芸入門