シェルスクリプトの (特殊) 変数について
[履歴] [最終更新] (2016/01/25 21:33:32)
1
作品
345
技術情報
最近の投稿
ここは
趣味の電子工作を楽しむ人のための作品共有プラットフォーム

ハードウェア技術を作品にして投稿してみませんか?
新着作品

値のセット/リセット

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