シェルスクリプトとはUNIXのコマンドを組み合わせて作るプログラムのことである。
コマンドラインから打ち込んで実行されるコマンドをひとつ以上ファイルに書いておくと、それらのコマンドを後から一つのコマンドのように何度でも実行できるようになる。
これはいつも同じ、複数のコマンドを実行しなければならない時などに便利である。
そして、それだけはなくC言語のような変数・配列・制御構造(if, while, switch, foreach)なども使えるので更に複雑な処理もできる。
とりあえずコマンド1つだけの簡単なシェルスクリプトを作ってみる。
ls
← lsだけ書き込んでviを終了する
% csh test.sh ← test.shを実行する test.sh ← test.shを実行した結果(test.shの中のlsコマンドが実行された結果) % ls test.sh ← キーボードから直接打ち込んだlsの結果もちろん表示されるファイル名は各自で違うものが表示されるかもしれない。
% vi test.sh ← test.shの中身をpwdに書き換える % cat test.sh ← test.shの中身を表示 pwd % csh test.sh ← test.shを実行する /amt/home0/ad010000/unix % pwd ← 直接pwdを実行する /amt/home0/ad010000/unix
次に、2つ以上のコマンドをファイルに書き込んで実行してみよう。
ls
pwd
% csh test.sh ← test.shを実行する test.sh ← lsの結果 /amt/home0/ad010000/unix ← pwdの結果
シェルでは変数を使うことができる。
この変数にはシェル変数と環境変数の2種類がある。
以下の例ではコマンドラインから実行しているが、 上のシェルスクリプトの説明で述べたように、これらのコマンドをファイルに書いておき、 後から、まとめて実行することもできる。
% set x = 123 ← 変数xに123を代入する % set y = 55.32 ← 変数yに55.32を代入する % set str = "this is strings." ← 変数strにthis is strings.を代入する % echo $x ← echoコマンドで変数xの中身を確かめる 123 % echo $y 55.32 % echo $str this is strings. % set z = $x % echo $z 123 % set z = "$x $y" % echo $z 123 55.32 % unset z ← 変数zを消去する % echo $z z - Undefined variable ← 変数zが存在しないというエラーメッセージ
環境変数もシェル変数と同じよう使用方法が可能である。
% setenv X 123 ← 変数Xに123を代入する % setenv Y test ← 変数Yに文字列testを代入する % setenv Z "$X $Y" ← 変数Zに$Y、$Zを代入する
シェルではログイン時にあらかじめ設定されている変数がいくつかある。
% set ← 現在設定されているシェル変数を表示する addsuffix argv () cwd /home0/ad010000/unix dirstack /home0/ad010000/unix echo_style both edit gid 500 group student history 1000 home /home0/ad010000 loginsh owd /home0/ad010000 path (/bin /usr/bin /usr/local/bin /usr/bin/X11 /usr/X11R6/bin) prompt %n@%m [%h] prompt2 %R? prompt3 CORRECT>%R (y|n|e|a)? shell /bin/tcsh shlvl 1 status 0 tcsh 6.09.00 term kterm tty pts/2 uid 10121 user ad010000 version tcsh 6.09.00 (Astron) 1999-08-16 (i386-intel-linux) options 8b,nls,dl,al,rh,color % env ← 現在設定されている環境変数を表示する TERM=kterm DISPLAY=:0.0 HOME=/home0/ad010000 SHELL=/bin/tcsh USER=ad010000 LOGNAME=ad010000 PATH=/bin:/usr/bin:/usr/local/bin:/usr/bin/X11:/usr/X11R6/bin HOSTTYPE=i386-linux VENDOR=intel OSTYPE=linux MACHTYPE=i386 SHLVL=1 PWD=/home0/ad010000/unix GROUP=student HOST=act61 HOSTNAME=act61 INPUTRC=/etc/inputrc LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35: LANG=ja_JP.eucJP LESSOPEN=|/usr/bin/lesspipe.sh %s
これらの値の一部は~/.cshrcまたは~/.loginファイルの中で設定している。
いくつかの変数の意味は以下の通り。
% set a = ( 1 2 3 ) ← 配列aに1 2 3を代入する % echo $a[1] 1 % echo $a[2] 2 % echo $a[3] 3 % echo $#a ← 配列aの要素の個数を表示する 3 % echo $a ← 配列aの要素を全部表示する 1 2 3 % echo $a[*] ← 同じく配列aの要素を全部表示する 1 2 3 % set b = ( "abc" 5 3.5 ) ← 配列bにabc 5 3.5を代入する % echo $b[1] abc % set c = ( $a[1] $b[2] $b[1] ) ← 配列cに配列aと配列bの要素を代入する % echo $c 1 5 abc % echo $c[1-2] ← 配列cの1番目から2番目の要素を表示する 1 5
シェルスクリプトの中で実行時の引数を取ってくる時には
$argv
という特別な変数(配列)を使用する。
この変数は配列なので引数の個数は
$#argv
で知ることができる。
これはC言語における
main(int argc, char *argv[])
の引数である argc, argv のようなものである。
echo "argv is " $argv[1]
% csh argv.sh ← 引数をつけないで実行 argv: Subscript out of range. ← エラー表示 % csh argv.sh ad010000 ← 引数をつけて実行 argv is ad010000 %
echo "argv is " $argv[1] $argv[2]
% csh argv.sh abe tomohiro ← 2つの引数をつけて実行 argv is abe tomohiro %