本資料は、bashシェルで動作確認を行いました。
各種$特殊変数について記述しています。
環境変数IFSについての記事に関しては以下の2つが参考になります。
| $# | 引数の数を示します |
| $数字 | 指定した数字の引数を示します |
| $? | 実行されたコマンドの終了ステータス値が格納されています。 通常0が正常終了です |
| $$ | 実行中のシェルスクリプトのプロセスID(PID)が格納さrています |
| $0 | 実行中のシェルスクリプトのファイル名が格納されています |
| $* | シェルスクリプトに渡された引数全てを示します。引数ごとの区切り文字はIFSに影響されます |
| $@ | 上記と同上ですが、IFSの影響は受けず、スペース区切りで全引数を保持しています |
#!/bin/bash echo $#
実行結果
$ chmod +x no1.sh $ ./no1.sh 1 2 3 4 5 5
引数として5つ渡されたことが確認できます。
#!/bin/bash echo "arg1: " $1 echo "arg2: " $2 echo "arg3: " $3
実行結果
$ chmod +x no2.sh $ ./no2.sh foo bar hoge arg1: foo arg2: bar arg3: hoge
lsコマンドの実行結果を確認しています。
正常終了のまた$?には0が格納されています。
echoコマンドにより$?の値を表示しています。
$ ls foo.txt bar.txt $ echo $? 0
lsコマンドで存在しないファイルを指定し実行しています。
エラー番号2が返却されているのが確認できます。
$ ls abc ls: abc にアクセスできません: No such file or directory $ echo $? 2
#!/bin/bash echo PID = $$
実行結果
no3.shのプロセスIDが4940であることが確認できます。
$ chmod +x no3.sh $ ./no3.sh PID = 4940
#!/bin/bash echo scriptname = $0 echo basename = `basename $0`
実行結果
以下はスクリプトのパスを指定して実行しています。
特殊変数$0にはパスも含めたスクリプト名が格納されているのが確認できます。
basenameコマンドによりスクリプト名のみ取り出すことが可能です。
$ chmod +x no4.sh $ ./no4.sh scriptname = ./no4.sh basename = no4.sh
#!/bin/bash IFS_BAK=IFS IFS=, echo "$*" echo $* IFS=IF_BAK
実行結果
$ chmod +x no5.sh $ ./no5.sh foo bar hoge foo,bar,hoge foo bar hoge
上記の実行結果を見ると、ダブルクォーテーションで囲んだ"$*"の場合は、IFSに指定された区切り文字で各引数が表示されています。
ダブルクォーテーションで囲んでいない$*はそのままで表示されているのが確認できます。
特殊変数$@は上記の$*と動作は変わりませんが、IFSの影響を受けません。
#!/bin/bash IFS_BAK=IFS IFS=, echo "$@" echo $@ IFS=IF_BAK
実行結果
$ chmod +x no6.sh $ ./no6.sh foo bar hoge foo bar hoge foo bar hoge
IFSの影響を受けていないのが確認できます。(上記の$*と見比べてください。)
以上、$特殊変数の記事でした。