Loose-Info.com
Last Update 2022/06/09
TOP - 各種テスト - bash - 特殊パラメータ

特殊パラメータ
特別な働きをするパラメータ(代入不可)

テスト概要

その1
*
位置パラメータに展開

その2
@
位置パラメータに展開

その3
#
位置パラメータの個数に展開

その4
?
最後に実行されたフォアグラウンドパイプラインの終了ステータスに展開

その5
$
シェルのプロセスIDに展開

その6
!
最後に実行されたバックグラウンドジョブのプロセスIDに展開

その7
0
シェルまたはシェルスクリプトの名前に展開


その1

特殊パラメータ : *
位置パラメータに展開

サンプルスクリプトファイル
sample.sh
#!/bin/bash # 「*」 : 位置パラメータに展開 echo "二重引用符無しの場合" echo "各位置パラメータは別々を単語に展開" n=1 echo $* for a in $* do echo "[$n] : $a" (( n+=1 )) done echo echo "二重引用符付きの場合" echo "特殊変数IFSの最初の文字で区切られた1つの単語に展開" echo "IFSが未設定" n=1 echo "$*" for a in "$*" do echo "[$n] : $a" (( n+=1 )) done echo "IFSを「:」に設定" n=1 IFS=':' echo "$*" for a in "$*" do echo "[$n] : $a" (( n+=1 )) done echo "IFSを空文字列に設定" n=1 IFS= echo "$*" for a in "$*" do echo "[$n] : $a" (( n+=1 )) done

実行結果
$ ./sample.sh a b c 二重引用符無しの場合 各位置パラメータは別々を単語に展開 a b c [1] : a <--- 別々の単語として出力 [2] : b <--- [3] : c <--- 二重引用符付きの場合 特殊変数IFSの最初の文字で区切られた1つの単語に展開 IFSが未設定 a b c [1] : a b c <--- 空白で区切られた1つの単語として出力 IFSを「:」に設定 a:b:c [1] : a:b:c <--- 「:」で区切られた1つの単語として出力 IFSを空文字列に設定 abc [1] : abc <--- 区切られずに1つの単語として出力

その2

特殊パラメータ : @
位置パラメータに展開

サンプルスクリプトファイル
sample.sh
#!/bin/bash # 「@」 : 位置パラメータに展開 echo "二重引用符無しの場合" echo "各位置パラメータを別々に単語に展開" n=1 echo $@ for a in $@ do echo "[$n] : $a" (( n+=1 )) done echo echo "二重引用符付きの場合" echo "各位置パラメータを別々に単語に展開" n=1 echo "$@" for a in "$@" do echo "[$n] : $a" (( n+=1 )) done

実行結果
$ ./sample.sh a b c 二重引用符無しの場合 各位置パラメータを別々に単語に展開 a b c [1] : a <--- 別々の単語として出力 [2] : b <--- [3] : c <--- 二重引用符付きの場合 各位置パラメータを別々に単語に展開 a b c [1] : a <--- 別々の単語として出力 [2] : b <--- [3] : c <---

その3

特殊パラメータ : #
位置パラメータの個数に展開

サンプルスクリプトファイル
sample.sh
#!/bin/bash # 「#」 : 位置パラメータの個数に展開 echo "位置パラメータの個数 : $#" echo "$@" a=( "$@" ) for (( i=1; i<$#+1; i++ )) do echo "\$$i : ${a[i-1]}" done

実行結果
$ ./sample.sh a b c 位置パラメータの個数 : 3 <--- $#を利用した位置パラメータ個数の出力 a b c $1 : a <--- $#を利用したループによる出力 $2 : b <--- $3 : c <---

その4

特殊パラメータ : ?
最後に実行されたフォアグラウンドパイプラインの終了ステータスに展開

c_sample1.c(実行ファイル c_sample1)
#include <stdio.h> int main() { printf("return 100\n"); return 100; }

c_sample2.c(実行ファイル c_sample2)
#include <stdio.h> int main() { char s[100]; fgets(s, 50, stdin); printf("fgets : %s", s); printf("return 200\n"); return 200; }

サンプルスクリプトファイル
sample.sh
#!/bin/bash # 実行ファイル c_sample1 を実行 ./c_sample1 echo "終了ステータス[1] $?" echo # パイプラインを実行 ./c_sample1 | ./c_sample2 echo "終了ステータス[2] $?"

実行結果
$ ./sample.sh return 100 終了ステータス[1] 100 <--- c_sample1の終了ステータス fgets : return 100 return 200 終了ステータス[2] 200 <--- c_sample2の終了ステータス

その5

特殊パラメータ : $
シェルのプロセスIDに展開

サンプルスクリプトファイル
sample.sh
#!/bin/bash echo "シェルのプロセスID : $$" ps

実行結果(1)
echoコマンドで特殊パラメータ「$」を出力
$ echo $$ 252 <--- 現在のシェルのプロセスID $ ps PID TTY TIME CMD 252 pts/0 00:00:00 bash 293 pts/0 00:00:00 ps

実行結果(2)
サンプルスクリプトファイルを実行
$ ./sample.sh シェルのプロセスID : 291 <--- 実行中のスクリプトのプロセスID PID TTY TIME CMD 252 pts/0 00:00:00 bash 291 pts/0 00:00:00 sample.sh 292 pts/0 00:00:00 ps

実行結果(3)
()を使用してサブシェル内でコマンドを実行
$ ( ps; echo $$; ps ) PID TTY TIME CMD 252 pts/0 00:00:00 bash 300 pts/0 00:00:00 bash 301 pts/0 00:00:00 ps 252 <--- ()に伴うサブシェルではなく、現在のシェルのプロセスID PID TTY TIME CMD 252 pts/0 00:00:00 bash 300 pts/0 00:00:00 bash 302 pts/0 00:00:00 ps

その6

特殊パラメータ : 0
シェルまたはシェルスクリプトの名前に展開

実行結果
$ ps <--- 現状プロセスの確認 PID TTY TIME CMD 252 pts/0 00:00:00 bash 329 pts/0 00:00:00 ps $ sleep 10 & <--- バックグラウンドジョブの開始 [1] 330 $ ps PID TTY TIME CMD 252 pts/0 00:00:00 bash 330 pts/0 00:00:00 sleep 331 pts/0 00:00:00 ps $ echo $! <--- 特殊パラメータ「!」を出力 330 $ ps <--- 10秒経過後に再度プロセスを確認 PID TTY TIME CMD 252 pts/0 00:00:00 bash 332 pts/0 00:00:00 ps [1]+ Done sleep 10 <--- バックグラウンドジョブ完了 $ echo $! 330 <--- 最後に実行されたバックグラウンドジョブのIDを出力

その7

特殊パラメータ : 0
シェルまたはシェルスクリプトの名前に展開
サンプルスクリプトファイル
sample.sh
#!/bin/bash echo $0

実行結果
$ echo $0 <--- echoコマンドによる出力 -bash <--- シェル名 $ ./sample.sh <--- スクリプトファイルを実行 ./sample.sh <--- スクリプトファイル名

実行環境

GNU bash, version 5.1.16


コード例・出力内容中の表記

・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。