システムプログラム(第10週): shスクリプトでよく使われる機能


電子・情報工学系/システム情報工学研究科CS専攻
新城 靖
<yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~syspro/2006/No10_files/sh.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~syspro/2006/
http://www.coins.tsukuba.ac.jp/~yas/

shスクリプトでよく使われる機能

シェル・スクリプトは、csh よりも sh の方が便利なことがある。

入出力の切替え

<file		標準入力をfileに切替える。
>file		標準出力をfileに切替える。fileの内容が上書きされる。
2>file		標準エラーをfileに切替える。fileの内容が上書きされる。
n>file		ファイル記述子nをfileに切替える。fileの内容が上書きされる。
n<file		ファイル記述子nをfileに切替える。
>>file		標準出力をfileに切替える。fileの末尾に追加される。
2>&1		標準エラーを標準出力と同じにする。
<&-		標準入力を閉じる。
>&-		標準出力を閉じる。
p1 | p2		p1 の標準出力をパイプに、p2 の標準入力をパイプに
p1 <<EOF	p1 の標準入力を、EOF という文字がが現れるで。
...
EOF
p1 <<EOF	p1 の標準入力を、EOF という文字がが現れるで。
...		変数を展開しない。
EOF'
'''

引数

$1 $2 $3 ...			n番目の引数
$0				プログラムの名前
$*				全引数
$@				全引数
"$@"				全引数(展開しない)
$#				引数の数
shift				引数のシフト
read var			標準入力から1行入力

シェル変数

csh とは異なり、setは不要である。
var=value			シェル変数の設定
var="value1 value2"		シェル変数の設定
unset var			シェル変数の解除(古いshにはない)
$var "$var" ${var}		シェル変数の利用。
$$				PID
sh には、「$var[index]」や「@ var=式」はない。

環境変数

sh で環境変数とは、シェル変数のうち export したものである。
var=value; export var		環境変数の設定
var="value1 value2"; export var	環境変数の設定
unset var			環境変数の解除
$var "$var" ${var}		環境変数の利用

コメント

#		コメント

引用符、エスケープ

"..."		$、``、\を解釈した文字列
'...'		文字列
`...`		...にあるプログラムを実行
\c		cそのもの(\* や \")で使う
\改行		行末のキャンセルX(1行で書けない時の継続行)

ファイル名、文字列の展開

 *		0文字以上の任意の文字列
?		任意の1文字
[abc]		[]の中の任意の1文字
オリジナルの sh では、「~user」はない。bash にはある。 sh という名前でありながら、実際には bash になっていることも多く、 その場合は sh でも使える。

if文

if [ ... ]
then
  cmd 
fi

if [ ... ]
then
  cmd
else
  cmd
fi

if [ ... ]
then
  cmd
elif [ ...  ]
  cmd
elif [ ...  ]
  cmd
else
  cmd
fi

test コマンド

test という名前の子マントが存在する。
% ls -l /usr/bin/test [←]
-rwxr-xr-x    1 root     root        16004 Jan 16  2001 /usr/bin/test
% file /usr/bin/test [←]
/usr/bin/test: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), stripped
% []
'[' は、伝統的には、そういう名前の外部コマンドである。 (sh の内部コマンドとして実装されていることもある。) マニュアルは、test で参照できる。
% ls -l /usr/bin/[ [←]
lrwxrwxrwx    1 root     root            4 Feb 24  2002 /usr/bin/[ -> test
% []
'[' コマンドの他に、普通のコマンドを書くこともできる。
if cmd
then
  cmd
else
  cmd
fi
if の cmd が exit 0 すると true、それ以外だと false となる。 (C言語と逆なので注意。)

if と同じ行に then を書く時には、「;」を付ける。

if [ ... ] ; then
  cmd 
fi

ループ

while [ ...  ]
do
   cmd
done

for var in w1 w2 w3 w4
do
   cmd $var
done

switch 文

case string in
pattern1) cmd;;
pattern2) cmd;;
 *
cmd;; esac )

その他

exit 数			終了
exec cmd		fork しないで自分自身で cmd を実行。戻ってこない。
. script		fork しないで自分自身で script を実行。終了後、戻ってくる。

'[' (test) コマンドで使える式

-eq -gt -ge -lt -gt -le -ne 比較(数)
= !=			比較(文字列)
! -a -o			論理演算
-r filename		読み込み可能
-w filename		書き込み可能
-x filename		実行可能
-e filename		ファイルが存在する
-f filename		普通のファイルが存在する
-d filename		ディレクトリが存在する
-s filename		ファイルが空でない
str			空でなければ真。"$var" の形式で使うのが普通。
( )			式のグループ化

実行構造

p1 ; p2		p1 の実行後 p2 の実行。
p1 &		p1 のバックグランド実行(waitしない)
p1 && p2	p1 を実行して、失敗したら終わり。成功したら p2 を実行。
p1 || p2	p1 を実行して、成功したら終わり。失敗したら p2 を実行。
( cmd )		fork して子プロセスで cmd を実行する。cd したい時など使う。

shの関数定義

最近の sh や bash では、関数が定義できる。
#!/bin/sh

ls_l()
{
	ls -l $*
}

ls_l $*

for文

for は、引数 $*、全てのファイル *、バック・クォート `` といっしょに使うことが多い。
% sh [←]
$ for f in * [←]
> do[←]
> echo $f[←]
> done[←]
file1
file2
file3
$ []
シェルスクリプトでは、for f in * の代りに、for f in $* を使えば引数、 `cat file` を使えば、file の内容ついてルー プを実行することができる。

計算

数の計算が必要な時には、sh では、expr コマンドを使う。 結果をシェル変数に入れるには、``と組み合わせる。
% sh [←]
$ x=`expr 1 + 2` [←]
$ echo $x [←]
3
$ []

ループの中での文字列の結合

$ x="" [←]
$ for i in a b c [←]
> do
> x="$x""$i"
> done
$ echo $x [←]
abc
$ []

コマンドの実行結果

if 文では、コマンドが成功したか失敗したかを調べることができる。 exit(0); した時に、成功(true)、それ以外の時に失敗(false) と扱う。
$ if /bin/true; then echo ok; fi [←]
ok
$ if /bin/false; then echo ok; fi [←]
$ []

Last updated: 2006/06/19 01:05:07
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>