VAR=128 # セット
VAR= # リセット
# unset VAR # リセットの別の方法 (変数の消去。unsetは関数の消去もできます)
'='の左右に空白が入るとエラーになります。
sample.sh
#!/bin/sh
TODAY=`date`
# TODAY = `date` # エラー
echo "Date: `date`, $TODAY"
実行例
$ ./sample.sh
Date: Thu Jul 25 23:50:18 JST 2013, Thu Jul 25 23:50:18 JST 2013
現在のコマンドのPID (多重起動を防止するサンプル)
PROG=`basename $0`
if [ $$ != `pgrep -o $PROG` ]
then
echo 'Already started.'
exit 1
fi
バックグラウンドのPID (応用サンプル)
sample.sh
#!/bin/sh
sleep 3 &
echo 128
wait $! # バックグラウンドのPIDが存在する限り待つ
echo 256
実行例
$ ./sample.sh
128 ←すぐに表示
256 ←3秒後に表示 (それまではwait)
C言語などの、ARGCやARGVに相当する特殊変数です。
sample.sh
#!/bin/sh
if [ $# -eq 0 ]; then
echo "No argument was specified."
exit 1
fi
echo $0 $1 $2
実行例1
$ ./sample.sh
No argument was specified.
実行例2
$ ./sample.sh arg1 arg2
./sample.sh arg1 arg2
特殊変数$?に、直前のコマンドの終了ステータス (正常終了であれば0(真), 異常終了であれば0以外(偽)) が格納されています。シェルスクリプトではC言語などと真偽値の判定基準が逆になっていることに注意しましょう。
echo $SHELL
関連して bash の場合は set -e
を記述することで、終了ステータスが 0 でない場合に終了させることができます。
#!/bin/sh
set -e
echo 123
mkdir /tmp/xxx
echo 234
mkdir /tmp/xxx || true
echo 345
mkdir /tmp/xxx
echo 456
実行例
$ ./sample.bash
123
234
mkdir: /tmp/xxx: File exists
345
mkdir: /tmp/xxx: File exists
set -o pipefail
を利用します。
#!/usr/bin/bash
set -e
set -o pipefail
false | echo hi
echo hi
実行例
$ bash sample.bash
hi
$ echo $?
1
trap と set -o errtrace
を利用します。
#!/usr/bin/bash
set -e
set -o errtrace
trap "echo hello" ERR
false
echo hi
実行例
$ bash sample.bash
hello
$ echo $?
1