シェルスクリプトと変数・配列

シェルスクリプトとは

シェルスクリプトとはUNIXのコマンドを組み合わせて作るプログラムのことである。
コマンドラインから打ち込んで実行されるコマンドをひとつ以上ファイルに書いておくと、それらのコマンドを後から一つのコマンドのように何度でも実行できるようになる。
これはいつも同じ、複数のコマンドを実行しなければならない時などに便利である。
そして、それだけはなくC言語のような変数・配列・制御構造(if, while, switch, foreach)なども使えるので更に複雑な処理もできる。

例1

とりあえずコマンド1つだけの簡単なシェルスクリプトを作ってみる。

  1. まず、viで以下の内容のファイルをtest.shという名前で作る。
    (ファイル名は何でも良いが、後ろに.shをつけておくとわかりやすくて良い)
    ls ← lsだけ書き込んでviを終了する
  2. そのファイルの中に書いたコマンド(この場合は ls)を実行する。
    そのためにcshというコマンドの後に今作ったファイルの名前を打ち込む。
    (C言語のようにコンパイルする必要が無いことに注意)
    % csh test.sh      ← test.shを実行する
    test.sh             ← test.shを実行した結果(test.shの中のlsコマンドが実行された結果)
    % ls
    test.sh             ← キーボードから直接打ち込んだlsの結果
    
    もちろん表示されるファイル名は各自で違うものが表示されるかもしれない。
    ここでのポイントはcsh test.shと打ち込むとlsと打ったのと同じ結果になっていることである。
  3. test.shに書いてあるlsをpwdに書き換えて実行してみる。
    % 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

次に、2つ以上のコマンドをファイルに書き込んで実行してみよう。

  1. vi によって test.sh に2つ以上のコマンドを並べて書いておく。
    ls
    pwd
  2. test.sh を実行する。
    lspwd が順番に実行されて結果が表示される。
    % csh test.sh      ← test.shを実行する
    test.sh             ← lsの結果
    /amt/home0/ad010000/unix   ← pwdの結果
    

シェル変数

シェルでは変数を使うことができる。
この変数にはシェル変数と環境変数の2種類がある。

シェル変数
シェルの動作環境を設定したり、シェルスクリプトで使用する。
環境変数
コマンドの動作環境を設定する。
UNIXのコマンドはこの環境変数によって動作を変更するものが多い。 (Maya には MAYA_PROJECT, MAYA_SCRIPT_PATH などの環境変数がある)

変数の使い方

シェル変数の例

以下の例ではコマンドラインから実行しているが、 上のシェルスクリプトの説明で述べたように、これらのコマンドをファイルに書いておき、 後から、まとめて実行することもできる。

% 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 のようなものである。

特別なシェル変数の例

  1. argv.shという名前で以下の内容のスクリプトを作る。
    echo "argv is " $argv[1]
  2. argv.shを実行する。
    % csh argv.sh             ← 引数をつけないで実行
    argv: Subscript out of range.        ← エラー表示
    % csh argv.sh ad010000    ← 引数をつけて実行
    argv is ad010000
    %
    
  3. argv.shを以下のように書き換える。
    echo "argv is " $argv[1] $argv[2]
  4. argv.shを実行する。
    % csh argv.sh abe tomohiro    ← 2つの引数をつけて実行
    argv is abe tomohiro
    %
    

練習課題

参考


Prev | Next
Home | Contents
abe@injapan.net