目次
シェルスクリプトを作成するときは、通常、$?、$ @などの特殊文字が使用されます。この記事では、すべてのシェル特殊文字を例とともに紹介します。最初にそれらを収集することをお勧めします。
1.シェルの特殊文字
1.1 $ N
以下に示すように、Nは数値を表し、$ 0は現在のスクリプトファイル名を表し、$ N(N> 0)はスクリプトに入力されたN番目の入力パラメーターを表します。
[root@localhost ~]# cat shell.sh
#!/bin/bash
echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
[root@localhost ~]# ./shell.sh 1 2 3 4 5 6 7 8 9 10
./shell.sh 1 2 3 4 5 6 7 8 9 10
[root@localhost ~]#
注: $ 0の出力は./shell.shです。
1.2 $#
スクリプトまたは関数に渡されるパラメーターの数は次のとおりです。
[root@localhost ~]# cat shell.sh
#!/bin/bash
echo $#
[root@localhost ~]# ./shell.sh 1 2 3
3
[root@localhost ~]#
[root@localhost ~]# cat shell.sh
#!/bin/bash
funcTest() {
echo $#
}
funcTest 1 2 3 4
[root@localhost ~]# ./shell.sh
4
[root@localhost ~]#
1.3 $ *
以下に示すように、スクリプトまたは関数に渡されるすべてのパラメーターを表します。
[root@localhost ~]# cat shell.sh
#!/bin/bash
echo $*
[root@localhost ~]# ./shell.sh 1 2 3 4 5
1 2 3 4 5
[root@localhost ~]#
[root@localhost ~]# cat shell.sh
#!/bin/bash
funcTest() {
echo $*
}
funcTest 1 2 3 4
[root@localhost ~]# ./shell.sh
1 2 3 4
[root@localhost ~]#
1.4 $ @
以下に示すように、スクリプトまたは関数に渡されるすべてのパラメーターを表します。
[root@localhost ~]# cat shell.sh
#!/bin/bash
echo $@
[root@localhost ~]# ./shell.sh 1 2 3 4 5
1 2 3 4 5
[root@localhost ~]#
[root@localhost ~]# cat shell.sh
#!/bin/bash
funcTest() {
echo $@
}
funcTest 1 2 3 4
[root@localhost ~]# ./shell.sh
1 2 3 4
[root@localhost ~]#
$ @と$ *の違い:
- 二重引用符で囲まれていない場合、2つの記号は同じであり、両方とも$ 1 $ 2 $ 3 ......の形式で出力されます。
- 二重引用符で囲むと、$ *はすべてのパラメーターを全体として出力します(例: "$ 1 $ 2 $ 3……")。$ @は各パラメーターを区切ります。例:$ 1 $ 2 $ 3……;
例を通して見てみましょう:
以下に示すように、最初に同じ状況を見てください。
[root@localhost ~]# cat shell.sh
#!/bin/bash
echo "\$*"
for i in $*
do
echo $i
done
echo "\$@"
for i in $@
do
echo $i
done
[root@localhost ~]# ./shell.sh 1 2 3 4 5
$*
1
2
3
4
5
$@
1
2
3
4
5
[root@localhost ~]#
以下に示すように、違いを見てください。
[root@localhost ~]# cat shell.sh
#!/bin/bash
echo "\$*"
for i in "$*"
do
echo $i
done
echo "\$@"
for i in "$@"
do
echo $i
done
[root@localhost ~]# ./shell.sh 1 2 3 4 5
$*
1 2 3 4 5
$@
1
2
3
4
5
[root@localhost ~]#
上記の例では、二重引用符で囲まれた$ *に含まれるすべてのパラメーターが全体として見なされ、「1 2 3 4 5」が直接出力され、$ @のパラメーターは引き続き分離されます。
1.5ドル?
以下に示すように、前のコマンドの終了ステータスまたは関数の戻り値を示します。
[root@localhost ~]# cat shell.sh
#!/bin/bash
pwd
echo $?
ls -l /root/abc
echo $?
[root@localhost ~]# ./shell.sh
/root
0
ls: 无法访问/root/abc: 没有那个文件或目录
2
[root@localhost ~]#
最初の$?の値は0であり、コマンドpwdが正常に実行されたことを示し、2番目の$?の値は2であり、最後のコマンドlsが実行に失敗したことを示します。
[root@localhost ~]# cat shell.sh
#!/bin/bash
funcTest(){
return 6
}
funcTest
echo $?
[root@localhost ~]# ./shell.sh
6
[root@localhost ~]#
[root@localhost ~]# cat shell.sh
#!/bin/bash
funcTest(){
echo "abc"
}
val=$(funcTest)
echo $?
[root@localhost ~]# ./shell.sh
0
[root@localhost ~]#
関数で$?を使用する場合、returnステートメントがあると、returnステートメントによって返される値が取得され、範囲は0〜255です。returnステートメントがない場合、$?の値は、関数で最後に実行されたコマンドの戻りコードを表します。
1.6 $$
以下に示すように、スクリプトの現在のプロセスのID番号を表します。
[root@localhost ~]# cat shell.sh
#!/bin/bash
echo $$
[root@localhost ~]# ./shell.sh
26033
[root@localhost ~]#
1.7ドル!
表すのID番号の最後の実行中の処理の背景を、また、必ずしも終了していない最も最近実行されているプロセスのID番号、として理解することができます。
[root@localhost ~]# top &
[2] 31702
[root@localhost ~]# echo $!
31702
[2]+ 已停止 top
[root@localhost ~]#
1.8 $-
以下に示すように、setコマンドと同じ機能を持つShellコマンドで使用されている現在のオプションを表示します。
[root@localhost ~]# cat shell.sh
#!/bin/bash
set -m
echo $-
set -C
echo $-
[root@localhost ~]# ./shell.sh
hmB
hmBC
[root@localhost ~]#
注: 2番目の出力では、設定したばかりのパラメーターCが追加されます。
2、まとめ
さて、シェルの特殊文字と例を組み合わせた説明は終了です。気持ちが良ければ、トリプル接続をワンクリックするだけです。ご不明な点がございましたら、コメント欄にメッセージを残してください〜