Last Update 2022/06/09
特殊パラメータ
特別な働きをするパラメータ(代入不可)
テスト概要
*
位置パラメータに展開
位置パラメータに展開
@
位置パラメータに展開
位置パラメータに展開
#
位置パラメータの個数に展開
位置パラメータの個数に展開
?
最後に実行されたフォアグラウンドパイプラインの終了ステータスに展開
最後に実行されたフォアグラウンドパイプラインの終了ステータスに展開
$
シェルのプロセスIDに展開
シェルのプロセスIDに展開
!
最後に実行されたバックグラウンドジョブのプロセスIDに展開
最後に実行されたバックグラウンドジョブのプロセスIDに展開
0
シェルまたはシェルスクリプトの名前に展開
シェルまたはシェルスクリプトの名前に展開
特殊パラメータ : *
位置パラメータに展開
位置パラメータに展開
サンプルスクリプトファイル
sample.sh
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つの単語として出力
特殊パラメータ : @
位置パラメータに展開
位置パラメータに展開
サンプルスクリプトファイル
sample.sh
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 <---
特殊パラメータ : #
位置パラメータの個数に展開
位置パラメータの個数に展開
サンプルスクリプトファイル
sample.sh
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 <---
特殊パラメータ : ?
最後に実行されたフォアグラウンドパイプラインの終了ステータスに展開
最後に実行されたフォアグラウンドパイプラインの終了ステータスに展開
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
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の終了ステータス
特殊パラメータ : $
シェルのプロセスIDに展開
シェルのプロセスIDに展開
サンプルスクリプトファイル
sample.sh
sample.sh
#!/bin/bash
echo "シェルのプロセスID : $$"
ps
実行結果(1)
echoコマンドで特殊パラメータ「$」を出力
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
特殊パラメータ : !
シェルまたはシェルスクリプトの名前に展開
シェルまたはシェルスクリプトの名前に展開
実行結果
$ 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を出力
特殊パラメータ : 0
シェルまたはシェルスクリプトの名前に展開
シェルまたはシェルスクリプトの名前に展開
サンプルスクリプトファイル
sample.sh
sample.sh
#!/bin/bash
echo $0
実行結果
$ echo $0 <--- echoコマンドによる出力
-bash <--- シェル名
$ ./sample.sh <--- スクリプトファイルを実行
./sample.sh <--- スクリプトファイル名
実行環境
GNU bash, version 5.1.16
コード例・出力内容中の表記
・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。