値のセット/リセット
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
プロセスID (PID)
現在のコマンドの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)
コマンドへの引数 (ARGV、ARGC相当)
C言語などの、ARGCやARGVに相当する特殊変数です。
$#: ARGCに相当。'#'はnumber。$0: 自分自身 (実行中のコマンドファイル) へのパス$1,$2, ...: 第i引数$@: 全引数リスト。"$@"とダブルクォーテーションで囲うと、$1$2...$nとそれぞれの引数を個別にダブルクォーテーションで囲んだものに展開されます。
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
終了ステータスが 0 でない場合に停止するスクリプト化 (bash)
関連して 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 して処理をするスクリプト
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
0
Web3関連の開発を行っています。分散型アプリケーションが研究テーマの学生です。
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。





