【shell】シェルのメタキャラクタ【特殊変数】

| 0件のコメント

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

メタキャラクタについて

シェルのメタキャラクタの一覧です。

& ; ` ' \ " | ? * ~ < > ^ ( ) [ ] { } $ \n \r

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

$ cmd1  | cmd2

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

$ cmd1  ; cmd2

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

$ cmd1  && cmd2

使用例です。インストールまでできるので他の作業に集中できます。


$ ./configure && make && make install

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

$ cmd1  || cmd2

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

$ cmd1 &

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

$ cmd1 > file 
$ cmd1 >> file # add
$ ls 1> file # stdout
$ ls 2> file # stderr
$ ls &> file # stdoutとsterr
$ abc 1>file 2>file2 # stdoutは1, sterrはfile2

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

$ cmd1  < file 

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

$ cat < /etc/passwd  | tail -3

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

$ grep -R '文字列' *

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

$ STR=`ls`; echo $STR

~(チルダ) は実行した User の HomeDir を表します。

$ echo ~
/home/hoge

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

特殊変数

? は $ を前に置く事で変数として動作し, 直前のコマンド実行後のステータスを表現します。

$ ls -a
.
$ echo $?
0

他の特殊変数では $$ は現在のPID, $! は前回のPIDを表します。

$ echo $$
928
$ echo $!
10339

シェルスクリプトの基本

以下のようなシェルスクリプト a.sh を作り, シェルスクリプトの基本を確認します。
テキストエディタで作成したファイルの権限は, 通常 `-rw-r--r--` となります。
ちなみに, シェルスクリプトの先頭行の #!/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 オプションを指定すると実行されたコマンドが表示され, 変数の値も確認できます。

コメントを残す

必須欄は * がついています