この記事は現役ウェブディベロッパーがわかりやすさにこだわって作成しました
declare(typeset)
変数を明示的に宣言してから使用します。この場合はいろいろな属性を与えることができるようになります。
- -a 変数を配列とする
- -f 変数を関数とする
- -i 変数を数値とする。
- -r 変数を読み出し専用とする。
- -x 変数をエクスポートする。
- -p 変数の値を表示する。
readonly
変数を読み出し専用として使用する場合はreadonlyを使用して変数を宣言すると便利です
local
bashスクリプトで使用される変数は基本的にすべてグローバル変数です。
関数内だけで変数を使用したい場合はlocalで変数を宣言すると、関数内で有効なローカル変数を使用できます。
特別な変数
シェルスクリプトが引数を得る場合、$1, $2
といった特別な変数を利用することができる。この変数は、$0 〜 $9
までしか使えない。それ以上引数があり、順番に取得したいなら shift
を利用する。
$0 | スクリプト名 |
$1 〜 $9 | 引数1番目から9番目 |
$* | すべての引数("$*" とした場合、"$1 $2 …" のように展開) |
$@ | すべての引数(ダブルクォートで囲んだ場合の処理が $* と異なり個別に引用される) |
$# | 引数の数 |
サンプルで見てみよう
#!/bin/sh echo "script name: $0" echo "arg num : $#" echo "arg 1 : $1" echo "arg 2 : $2" echo "arg 3 : $3" echo "arg 4 : $4" echo "arg 5 : $5" echo "arg 6 : $6" echo "arg 7 : $7" echo "arg 8 : $8" echo "arg 9 : $9" echo "arg 10? : $10" echo "all arg : $*" exit 0
を実行すると以下のように $9
まで展開されていることがわかる
$ ./cmd.sh a b c d e f g h i j k l script name: ./cmd.sh arg num : 12 arg 1 : a arg 2 : b arg 3 : c arg 4 : d arg 5 : e arg 6 : f arg 7 : g arg 8 : h arg 9 : i arg 10? : a0 all arg : a b c d e f g h i j k l $
このほかに以下のようなものがある。
$? | 直前に実行したコマンドのexit値 |
$$ | シェル自身のプロセスID |
$- | シェルの起動時のフラグの一覧 |
$! | シェルが最後に起動したバックグラウンドプロセスのプロセスID |
また、環境変数などは、特別な処理でない限り変数として利用するのは避けたほうがよい(使ってはいけない)。
PATH | シェルが実行可能なコマンドを検索するディレクトリを指定。ピリオドがカレントディレクトリを意味するが、設定はしないほうがよい。明確にカレントディレクトリのコマンドを実行する場合、./script.sh という具合に実行するほうが確実に意図したスクリプトやコマンドが実行できる。 |
IFS | 区切り文字として扱う文字を指定。 |
基本的には、シェル上で引数なしのset
を実行した際に表示される環境変数(PATH, USER, UID, PRINTER, TERM, TZ,
etc.)をローカル変数として利用するのは避けたほうがよい。
準変数
変数を参照する際に、変数がNULLであった場合の評価を設定することができます。
${VAR:-expression} | 値がセットされていない(NULL)場合、:- 以降の式を評価結果を返す。 |
${VAR:+expression} | 値がセットされている(NONE-NULL)場合、:+ 以降の式を評価結果を返す。 |
${VAR:=expression} | 値がセットされていない(NULL)場合、:= 以降の式を評価結果を返し変数に代入。 |
${VAR:?[expression]} | 値がセットされていない(NULL)場合、式が標準エラーに出力。 |
サンプルで見てみよう
#!/bin/sh echo "[ null variable ]" VAR= EXPAND=${VAR:-blue} echo "-var : $VAR" echo "-expand : $EXPAND" EXPAND=${VAR:+yellow} echo "+var : $VAR" echo "+expand : $EXPAND" EXPAND=${VAR:=green} echo "=var : $VAR" echo "=expand : $EXPAND" echo "" echo "[ non-null variable ]" VAR=red EXPAND=${VAR:-blue} echo "-var : $VAR" echo "-expand : $EXPAND" EXPAND=${VAR:+yellow} echo "+var : $VAR" echo "+expand : $EXPAND" EXPAND=${VAR:=green} echo "=var : $VAR" echo "=expand : $EXPAND" exit 0
を実行すると以下のように評価されます。
$ ./var.sh [ null variable ] -var : -expand : blue +var : +expand : =var : green =expand : green [ non-null variable ] -var : red -expand : red +var : red +expand : yellow =var : red =expand : red $
特殊文字
以下の文字は特殊文字として扱われます
; | & ^ $ ? * < > ( ) [ ] { } ` " ' TAB SPACE NEWLINE
これら特殊文字を表示するには、エスケープする必要があります。エスケープの方法は、バックスラッシュを利用して一文字単位で行うか、シングルクオーテーションで囲むことで行えます。ダブルクオーテーションで囲んだ場合、$ ` \
は評価されます。つまり、変数やコマンドは処理されます。
* | ZERO またはすべての文字にマッチします。また、引数で利用した場合、すべてのファイル名を展開 |
? | 一文字にマッチ |
[range] | 文字範囲にマッチ |
\ | 特殊文字をエスケープ |
' ' | 囲まれたすべてを文字列として扱う |
" " | $ ` \ を評価し囲まれたすべてを文字列として扱う |
` ` | コマンドを評価 |
この記事についてのご質問またはお困りのことがございましたら、お気軽にお問い合わせください。