Sh スクリプト [unix 基礎]

なぜ sh でスクリプトを書くか?

  • 入出力リダイレクションが自由 -- csh では標準出力と標準エラーを分けて扱えない
  • trap(組み込みコマンド)でシグナルを扱える

変数

  • 変数名は英数字とアンダースコア(_)から成る。ただし1文字目が数字ではいけない
new_file2  (OK)
_local_    (OK)
2of3       (エラー、数字で始まっている)
  • 変数を参照する時には、直前にドル記号($)を付ける。紛らわしい場合には変数名を波括弧({})で囲む
echo $HOME
cp this.file $HOME/
cp $file ${file}new
  • 変数には等号(=)を使って、数値か文字列が代入できる。ただし、= の前後にスペースを入れてはいけない!
var1=456       (数値を代入)
var2 = 456     (エラー、余分な空白)
var3='text'    (文字列の代入)
var4='text $a' ($a はそのまま代入される)
var5="text $a" ($a を変数として、展開してから代入)
  • 特別な変数
$0           (シェルの名前またはシェルスクリプト名)
$1, $2, ...  (スクリプトの1つ目の引数、2つ目の引数、...)
$@           (引数全部)
$#           (引数の数)

制御文

  • IF-THEN-ELSE
if [ 条件文1 ]         # [ の前後と ] の前には空白が必要
then
  処理1
elif [ 条件文2 ]
  処理2
else
  処理3
fi
  • 条件文については、この下の「テスト」を参照
  • ifthen を1行に書くには、; を使ってこうする
if [...]; then
例)
  if [ -f test.dat ]; then   # test.dat というファイルがあれば
     ./myprogram test.dat     # プログラムを実行
  fi
  • CASE
case $変数 in       # 変数を参照するので $ を付ける
値1)
  処理1
  ;;
値2)
  処理2
  ;;
値3|値4)
  処理3
  ;;
*)
  デフォルト処理
  ;;
esac
  • FOR
for 変数 in 値1 値2...    # 変数に代入するので $ は付けない
do
  処理
done
例)
  for file in *.dat     # 全てのデータファイル(*.dat)について
  do                    # 1つづつ
    ./myprogram $file   # プログラムで処理する
  done
  • UNTIL
until [ 終了条件 ]
do
  処理
done
  • WHILE
while [ 条件文 ]
do
  処理
done

  • 式の評価には expr コマンドを使用する
  • 評価の結果を変数に代入する場合には逆引用符(`)で囲む
n=1
while [ $n -lt 10 ]
do
  ...
  n=`expr $n + 1`
done
  • 最近の sh は直接評価できる
n=1
while [ $n -lt 10 ]
do
  ...
  n=$(($n + 1))
done

テスト

  • 条件のテストには test コマンドを使う
  • [test コマンドの別名
例)
  if [ -r file ]
  then
    echo "file is readable"
  fi
  • テストオペレータ
-r file        ファイルが存在し、読み込み可
-w file        ファイルが存在し、書き込み可
-x file        ファイルが存在し、実行可
-f file        普通のファイルが存在する
-d dir         ディレクトリが存在する
-s file        ファイルが存在し、サイズがゼロではない
-z string      文字列の長さがゼロ
-n string      文字列の長さが1以上
str1 = str2    同じ文字列である
str1 != str2   同じでない文字列
"string"       空文字ではない
n1 -eq n2      2つの数値が等しい
n1 -ne n2      2つの数値が等しくない
n1 -gt n2      n1 は n2 より大きい
n1 -ge n2      n1 は n2 より大きいか等しい
n1 -lt n2      n1 は n2 より小さい
n1 -le n2      n1 は n2 より小さいか等しい
exp1 -a exp2   論理積
exp1 -o exp2   論理和

入出力リダイレクション

<file    file を標準入力にする
>file    標準出力を新しいファイルに書く
>>file   ファイルが存在するなら、標準出力をそこに追加する
<<delim  delim で始まる行までを標準入力にする
2>file   標準エラー出力を新しいファイルに書く
2>&1     標準エラー出力と標準出力を結合する
2>>&1    標準エラー出力を標準出力に追加する
2|       標準エラー出力を次のコマンドにパイプする
2>&1|    標準エラー出力と標準出力を結合し、パイプする

TRAP

  • シェルがシグナル(signal)を受け取った時の処理を設定する
''trap action signal...''
  • action が空文字なら、指定されたシグナルは無視される
  • action を省略すると、シグナルはデフォルトの動作をする
  • signal は番号で指定
  • Example)
trap (rm tmpfile; exit 1) 1 2 3

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2004-10-29 (金) 14:31:12 (5494d)