2008年06月20日 情報科学類 コンピュータリテラシ 筑波大学 システム情報工学研究科 コンピュータサイエンス専攻, 電子・情報工学系 新城 靖 <yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2008/2008-06-20
/sh.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/
以下で「$
」は、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
<<'EOF' p1 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 [ ... ]
then
cmd
fi
if [ ... ]
then
cmd
else
cmd
fi
if [ ... ]
then
cmd
elif [ ... ]
cmd
elif [ ... ]
cmd
else
cmd
fi
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
case string in
pattern1) cmd;;
pattern2) cmd;;
*
cmd;;
esac
)
exit 数 終了
exec cmd fork しないで自分自身で cmd を実行。戻ってこない。
. script fork しないで自分自身で script を実行。終了後、戻ってくる。
-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 や bash では、関数が定義できる。
#!/bin/sh
ls_l()
{
ls -l $*
}
ls_l $*
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 /usr/bin/true; then echo ok; fi
ok
$ if /usr/bin/false; then echo ok; fi
$