シェルスクリプトの (特殊) 変数について
[履歴] [最終更新] (2020/04/14 19:09:16)
最近の投稿
注目の記事

値のセット/リセット

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 して処理をするスクリプト

trapset -o errtrace を利用します。

#!/usr/bin/bash
set -e
set -o errtrace

trap "echo hello" ERR
false
echo hi

実行例

$ bash sample.bash 
hello
$ echo $?
1
関連ページ
    概要 シェル関数は複数のコマンドをひとまとめにしたものです。引数の取得では、シェルスクリプトの引数と同じ名称の特殊変数を使用します。また、独自のローカル変数を用意することができないため、関数外で使用されている変数の内容を書き換えてしまう危険性があります。 シェル関数は複数のコマンドをまとめたもの sample.sh
    概要 sbt は Scala および Java を主な対象としたビルドツールです。Scala Build Tool の略ではありませんが、Simple Build Tool という明示的な記述も公式ドキュメントなどには見当りません。以下 sbt の基本的な使用例をまとめます。使用した sbt のバージョンは 0.13 です。
    概要 以下のシステムコールに関する、C 言語のサンプルコードです。 fork execv exit wait 子プロセスを fork で作成して execve でプログラムを実行 以下のプログラムでは、シェルで echo コマンドを実行したときと同じように、シェルに相当する親プロセスで fork で子プロセスを生成して、子プロセス内で
    概要 プロセスの情報を取得および設定するためのシステムコールに関する、C 言語のサンプルコードです。 各種 ID プロセスID の取得 (getpid/getppid) コマンドラインから直接実行したプログラムの親プロセスはシェルになるため getppid() で取得されるプロセスID は と同じ値になります。
    概要 シェル変数はすべて文字列扱いであるため、数値計算のためには専用のコマンドを用いる必要があります。 整数同士の計算 整数同士の四則演算にはexprコマンドを使用します。 sample.sh #!/bin/sh expr 1 + 1 expr 1 - 1 expr 1 '*' 1 # ワイルドカードと区別するために、クォーテーションで囲う必要があります expr 1 / 1 expr 1
    コマンドのエイリアスを登録する (update-alternatives) mybin という名前のコマンドを登録 sudo update-alternatives --install /usr/local/bin/mybin mybin /usr/bin/echo 10 sudo update-alternatives --install /usr/local/bin/mybin mybin