はじめに
この記事は
シェルプログラミング入門1
シェルプログラミング入門2
の続編である。
シェル関数
シェル関数は下のような形式である。
name(){command・・・・・
}
ls -l
と同じ動作をするlsl
という関数を作ってみる。
% lsl(){>ls-l>}
% lsl
total 48
-rw-r--r-- 1 Tomoki staff 7 4 16 09:23 abc
-rwxr-xr-x 1 Tomoki staff 127 4 16 09:17 append*-rwxr-xr-x 1 Tomoki staff 25 5 2 12:14 kkk*-rwxr-xr-x 1 Tomoki staff 18 5 2 12:07 mmm*-rwxr-xr-x 1 Tomoki staff 45 5 2 11:51 nnn*-rw-r--r-- 1 Tomoki staff 13 4 16 09:30 xyz
$*
で引数をとれるようにしてみる。
% lsl(){function>ls-l$*function>}
% lsl *c
-rw-r--r-- 1 Tomoki staff 7 4 16 09:23 abc
これから基本的に関数内の変数には_
で始めるようにする。
ちなみに以下のようなシェルスクリプトを作ったとき、そのまま実行してもシェルスクリプト内で定義されたコマンド(以下の場合pse)を使うことができない。
そういうときには.
コマンドを使って、. script_file
のようにする。
% chmod +x aaa
% ./aaa
% pse
zsh: command not found: pse
% . ./aaa
% pse
PID TTY TIME CMD
1 ?? 12:58.82 /sbin/launchd
136 ?? 1:14.00 /usr/sbin/syslogd
・・・・・・・・
.
コマンドを使って実行するシェルスクリプトには拡張子.sh
をつけることが多い。また、直接実行しないように、モードは読み書きだけを許可し、ディレクトリも普通のコマンドとは分けられる。
組み込みコマンド
nullコマンド:
何もしないがいつも0(true)を返すコマンド。
また、nullファイルを作ったり、ファイルの中身を消去したりすることができる。%: > file
はcp /dev/null file
やcat /dev/null > file
と同じである。
ドットコマンド.
先ほどシェル関数のところで出てきた. file
という形で使うもの。
普通のコマンドと違い、新しくプロセスを作らず現行のシェルのプロセスを使って指定されたファイルを読み込み実行するもの。
breakコマンド
forやwhileのループから抜け出すときに使用するコマンド。
デフォルトでは1つのループを抜ける。break number
のように何個のループを抜けるか引数として指定できる。
continueコマンド
forやwhileのループで,処理を中断し、次の繰り返しに移行させるコマンド
デフォルトでは次の繰り返しのステップに移行する。break number
のように何番目の繰り返しのステップに移行するか引数として指定できる。
ehcoコマンド
引数の部分を標準出力に出力する。echo parameter
のようにして使う。
使っているUNIX(system V系列かBSD系列)によって出力方法が異なる。
evalコマンド
evalコマンドは複数の置換などを1行のコマンドで全部展開する。
% VAR1=value
% VAR2=VAR1
% echo$"$VAR2"$VAR1#代入されない
% echo$$VAR2
22202VAR2
% echo$'$VAR2'$VAR2
% echo\$$VAR2$VAR1#evalを使えばVAR1にも代入される
% eval echo\$$VAR2
value
% eval echo$"$VAR2"
value
またevalコマンドにはコマンドの結果が「何かを実行させるコマンドの形式をとって」返されたとき、それをそのまま実行させるというような場合にも利用される。
execコマンド
exec command
のような形で使う。
新しくプロセスを作らず現行のカレントシェルのプロセスと置き換えて、引数のコマンドを実行させる。
exitコマンド
シェルを終了するときに使う。exit number
のように番号を引数にすることでシェルスクリプトの終了コードを指定できる。
また、終了コードは$?変数に渡される。
exportコマンド
export name
というふうにnameで指定した変数を他のコマンドやシェルからも利用できるようにする。
pwdコマンド
カレントディレクトリの完全パスを表示する。
readコマンド
標準入力を読み取り、変数に代入する。
#!/bin/shecho-n"enter yes or no --> "read ANSWER
echo$ANSWER
% ./aa
-n enter yes or no -->yes#yesと入力するyes
readonlyコマンド
指定された変数を書き換え不可にする。変数に代入したり、unsetしたりできなくなる。readonly name...
のように使う。
returnコマンド
シェルの関数から抜けるコマンド。
引数が関数の返り値になる。
setコマンド
シェルのオプションをONにしたりOFFにしたりする。
% sh #シェルの起動$ echo abc
abc #普通は結果のみ$ set-v#-vオプション(冗長モード)をつける$ echo abc
echo abc #結果の前に入力コマンドが表示される
abc
$ set +v #-vオプションを元に戻すset +v
$ echo abc
abc #結果のみ
そのほかにもいろいろなオプションがある。
-をつけるとオプションがONになり、+をつけるとOFFになる。
set parameter
のようにすると、位置パラメタに値をセットすることができる。
#!/bin/shecho$0$1$2$3$4set aa bb cc
echo$0$1$2$3$4
これを実行すると
% chmod +x vvv
% ./vvv 1 2 3 4 5
./vvv 1 2 3 4
./vvv aa bb cc
setコマンドによってそれまでの位置パラメタの値が全部クリアされる。
引数なしにset
とすると、現在セットされている変数の一覧とその値が表示される。
shiftコマンド
位置パラメタの値を左にずらす
#!/bin/shecho$0$1$2$3$4$5$6$7$8$9shift
echo$0$1$2$3$4$5$6$7$8$9shift 3
echo$0$1$2$3$4$5$6$7$8$9shift$# #位置パラメタをクリアするecho$0$1$2$3$4$5$6$7$8$9
位置パラメタを全部クリアするにはshift $#
とする。
これに引数を与えて実行すると
% chmod +x ooo
% % ./ooo aa bb cc dd ee ff gg hh ii
./ooo aa bb cc dd ee ff gg hh ii
./ooo bb cc dd ee ff gg hh ii
./ooo ee ff gg hh ii
./ooo
testコマンド
条件を判定し、正しいとき0(true)を返す。
test expression
もしくは[ expression]
のように書く。
trapコマンド
trap action signal...
signalに指定したシグナルを受け取ったときにどういう処理をするかをactionのところに指定する。actionはコマンドを並べたもの。
typeコマンド
コマンドが組み込みコマンドかどうかやコマンド本体のある場所を調べる。
% type echo date
echo is a shell builtin
date is /bin/date
umaskコマンド
ファイルを生成するときにモードを決定する。-rwxr-xr-x
や-rw-r--r--
などがモードである。モードは8進数で表現され、rが4, wが2, xが1と考える。
例えば、-rw-r--r--
は644となる。
umask mask
としてからファイルを作る(touchコマンドなどで)と、作成したファイルのモードは666(対象がディレクトリなら777) - mask
となる。
何もせずにファイルを作るとumaskの値は022,つまり644(読み書き移動可)となる。
unsetコマンド
指定した変数や関数を消去する。
unset name
waitコマンド
引数に動作しているプロセスIDを指定し、
そのプログラムが終了するまで待つ。
command&
・・・・
wit $1
引数を指定しないとき、そのシェルから派生しているプロセスが全て終了するまで待ち状態となる。返り値は0となる。