1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェルスクリプトでの$コマンドの使い方まとめ

2022-02-08 23:03:19

    今日は在宅勤務の4日目、徐々に自宅で仕事のリズムの少しを発見し、いくつかのシェルスクリプトを変更し、変更の過程で、まだいくつかの知識のポイントを統合する必要があることがわかった、ここで書き出すには、印象を深めています。

   記号は、あなたにとって新しいものではないはずです。シェルスクリプトでは、$はほとんどのことに使われるので、ここにすべての$の組み合わせのリストを示しますので、効果を見ることができます。

   $で構成されたコマンドは、おそらく以下のようなものでしょう。

$0,$1... $? ,$! ,$$,$*,$#,$@

ここで、それぞれの意味について見てみましょう。

1.$0,$1

0と$1はそれぞれ、スクリプトの名前とスクリプトの最初のパラメータを意味すると理解するのがよいでしょう、では例を見てみましょう。

jwfyyzdembp:tmp jwfyyz$ cat test.sh
echo 'The meaning of $0 is':$0
echo 'The meaning of $1 is':$1
jwfyyzdembp:tmp jwfyyz$ . /test.sh yeyz
The meaning of $0 is:. /test.sh
The meaning of $1 is:yeyz
jwfyyzdembp:tmp jwfyyz$ sh test.sh yeyz
The meaning of $0 is:test.sh
The meaning of $1 is:yeyz

   注意点としては、./test.shメソッドを使用してスクリプトを実行する場合、$0の値は. /test.sh であり、test.sh ではありません。

2. $?

は、最後に実行したコマンドの実行戻りコードを指し、次の例のように、実行が成功した場合は0を、そうでない場合は1を返します。

jwfyyzdembp:tmp jwfyyz$ cat test.sh 
echo 'The meaning of $0 is':$0
echo 'The meaning of $1 is':$1
ls -l a.txt
echo '$? The result is '$?
ls -l test.sh
echo '$? The result is '$?

jwfyyzdembp:tmp jwfyyz$ sh test.sh yeyz
The meaning of $0 is:test.sh
The meaning of $1 is:yeyz
ls: a.txt: No such file or directory
$? The result is 1
-rwxr-xr-x 1 jwfyyz wheel 124 2 7 20:32 test.sh
The result of $? The result is 0

   このように、1回目にls -l a.txtを実行すると、ディレクトリにa.txtファイルがないので1を返し、2回目に実行すると、test.shファイルが存在するので0を返します。

3.$$

  $$ は、例として、スクリプトが実行されている現在のプロシージャの ID 番号を指します。

jwfyyzdembp:tmp jwfyyz$ cat test.sh 
pwd
echo $$
sleep 10

jwfyyzdembp:tmp jwfyyz$ sh test.sh &
[1] 60658

jwfyyzdembp:tmp jwfyyz$ ps -ef|grep test
 501 60658 60529 0 8:36 PM ttys000 0:00.01 sh test.sh
 501 60661 60529 0 8:36 PM ttys000 0:00.00 grep test

   test.shスクリプトの後にsleep 10というコマンドを設定し、スクリプトの実行後に10秒間スリープし、60658という値を出力しています、この時点で現在のスクリプトのプロセス番号を確認すると子プロセスのプロセスIDは60658であることが分かります

4. と $@

  この二つを一緒にしているのは、主にリファレンスの全パラメータを表し、その結果を個別にプリントするためで、同じものですが、ループ内でその内容をプリントすると、例えば次のように違いが分かります。

jwfyyzdembp:tmp jwfyyz$ cat test.sh 
echo 'The result of $* is':$*
echo 'The result of $@ is':$@
echo "-- \$* demo ---"
for i in "$*"; do
 echo $i
done

echo "-- \$@ demo ---"
for i in "$@"; do
 echo $i
done

jwfyyzdembp:tmp jwfyyz$ sh test.sh yeyz 1 2 3
The result of $* is:yeyz 1 2 3
The result of $@ is:yeyz 1 2 3
-- $* demo ---
yeyz 1 2 3
-- $@ demo ---
yeyz
1
2
3

   ご覧の通り、ループは$@で出力されます。 

5.$#

  はわかりやすいですね、引数の数を意味します。例

jwfyyzdembp:tmp jwfyyz$ cat test.sh 
echo 'The result of $* is':$*
echo 'The result for $@ is':$@
echo 'The result of $# is':$#

jwfyyzdembp:tmp jwfyyz$ sh test.sh yeyz 1 2 3
The result of $* is:yeyz 1 2 3
The result of $@ is:yeyz 1 2 3
The result of $# is:4

6.$!

  このコマンドは、シェルスクリプトで最後に実行されたバックグラウンドコマンドのプロセスID番号を次のように表示するものです。

jwfyyzdembp:tmp jwfyyz$ cat test.sh 
echo 'The result of $* is':$*
echo 'The result for $@ is':$@
echo 'The result of $# is':$#
sleep 10 &
echo 'The result of $! The result of ':$!
sleep 10

jwfyyzdembp:tmp jwfyyz$ sh test.sh yeyz 1 2 3 &
[1] 61237
The result of $* is:yeyz 1 2 3
The result of $@ is:yeyz 1 2 3
The result of $# is:4
The result of $! The result of:61238

jwfyyzdembp:tmp jwfyyz$ ps -ef|grep sleep
 501 61238 61237 0 9:12 PM ttys000 0:00.00 sleep 10
 501 61239 61237 0 9:12 PM ttys000 0:00.00 sleep 10
 501 61241 60529 0 9:12 PM ttys000 0:00.00 grep sleep

  test.shでは、sleep 10のようなコマンドでバックグラウンドで実行し、$! ps -efコマンドでプロセス情報を調べると、プロセス61238に対応するコマンドはsleep 10であり、現在のスクリプト実行のプロセス番号を反映した$$と、スクリプト内のコマンドのプロセス番号である$!と区別される。

上記はシェルスクリプトでの$記号の使い方の一例です。シェルの$についての詳しい情報は、スクリプトハウスの他の関連記事を参照してください!