作成日
2013/07/26最終更新
2022/07/19記事区分
一般公開値のセット/リセット
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
関連記事
- UNIX リダイレクションについて「下記ファイルディスクリプタがプロセスと結びつける対象ファイル」を別のファイルに変更することをリダイレクションとよびます。実際には、ファイルディスクリプタ1と2の対象ファイルの変更を指すことが多いです。 ファイルディスクリプタとは? ファイルディスクリプタは「プロセス」と「プロセスが使用するファイル」を結びつけるもので、それらには0,1,2,...と連続した番号が割り当てられています。ファイルディ...
- シェルスクリプトにおける数値計算シェル変数はすべて文字列扱いであるため、数値計算のためには専用のコマンドを用いる必要があります。 整数同士の計算 整数同士の四則演算にはexprコマンドを使用します。 sample.sh #!/bin/sh expr 1 + 1 expr 1 - 1 expr 1 '*' 1 # ワイルドカードと区別するために、クォーテーションで囲う必要があります expr 1 / 1 expr 1 % 1 実行...
- egrepとgrepの違いgrepは 'g'lobal 'r'egular 'e'xpression 'p'rint つまり、全体から正規表現で一致したものを抽出するためのコマンドです。egrepは 'e'xtended grep つまりgrepの機能拡張版です。拡張正規表現とよばれる式が使用できるため、grepと比較して高度な抽出が可能になります。とはいえ、grepに'-E'オプションを付与して実行するとegrepとほぼ...
- シェルスクリプトにおける関数定義シェル関数は複数のコマンドをひとまとめにしたものです。引数の取得では、シェルスクリプトの引数と同じ名称の特殊変数を使用します。また、独自のローカル変数を用意することができないため、関数外で使用されている変数の内容を書き換えてしまう危険性があります。 シェル関数は複数のコマンドをまとめたもの sample.sh #!/bin/sh echo1(){ echo 1 } echo1 実行例 $ ...
- シェルスクリプトでシグナルをキャッチする無限ループに陥ってしまったプロセスを強制終了させるためにはCtrl-Cやkillコマンドを利用します。このとき、プロセスにはシグナルというものが送られています。プロセスはシグナルの種類に応じて既定された処理を実行します。trapコマンドを用いると、各シグナル番号に対応する既定の処理を書き換えることができます。 trapコマンド シグナルN1, N2, N3, ...を受けたときに実行するコマンドを...