【shell】$から始まる特殊な変数まとめ【Linux】

10月 4, 2023

どもども、意味もなくsupuremeのお箸を購入するか検討中のsaisaiです。


平日学習強化プロジェクトということで、相変わらず投稿していきます。


本日はシェルスクリプトを書く際頻繁に利用する、"$"から始まる特殊な変数をまとめてみましたので使用方法と合わせて紹介いたします。

引数に関する変数($#,

引数に関する変数($#,$0-9,$*,$@)

-9,$*,$@)

$#はコマンドに渡される引数の数を返します。

例えば"test.sh"というファイルで以下のようなスクリプトを用意し

#! /bin/bash

echo $#

引数をつけて実行するとその数を返してくれます。

$ ./test.sh 1 2 3 4
4

ちなみにですが、特定の位置の引数を返したい場合は$1から$9までで指定してあげてください。

#! /bin/bash

echo $1

例えば上記のように指定すると

$ ./test.sh 1 2 3 4
1

このような結果が得られます。他にも、$0で指定してコマンドそのものを出力することもできます。


また、全ての引数を返す場合は$*か$@を使用します。

#! /bin/bash

echo $*
echo $@

とした場合

$ ./test.sh 1 2 3 4
1 2 3 4 (引数の数は1つという扱い)
1 2 3 4 (引数の数は4つという扱い)

となります。返している値は一見同じように見えますが上記に記載している通り引数を幾つとして扱っているかに違いがあるので、シェルスクリプトに組み込む場合は注意が必要です。

特殊変数($?,$$,$!,$-)

次はさらに汎用的な特殊変数をみていきましょう。

まずは$?です。コマンド実行時の終了ステータスを返します。正常に終了した場合は"0″、以上終了の場合は"1″を返します。例えば、下記のようなスクリプトを実行すると

! /bin/bash

ls -la
echo "--------------------------"
echo $?

下記のような結果となります。

$ ./test.sh
total 12
drwxr-xr-x 2 root root 4096 Jul  6 13:28 .
drwxr-xr-x 1 root root 4096 Jul  6 12:38 ..
-rwxr--r-- 1 root root   63 Jul  6 13:28 test.sh
--------------------------
0

こちらは"ls -la"というコマンド部分の実行結果と、その終了ステータスを線で区切るようにして出力しています。

コマンドが無事成功しているので、0ステータスが返されていますね!


次に$$です。こちらはそのコマンドを実行しているプロセスのIDを返してくれます。

! /bin/bash

ls -la
echo "--------------------------"
echo $$

上記のようなスクリプトを実行した場合

$ ./test.sh
total 12
drwxr-xr-x 2 root root 4096 Jul  6 13:33 .
drwxr-xr-x 1 root root 4096 Jul  6 12:38 ..
-rwxr--r-- 1 root root   63 Jul  6 13:33 test.sh
--------------------------
40

このように帰ってきます。


お次は$!です。こちらもプロセスIDを返すものですが、バックグラウンドジョブのプロセスIDを返します。

例えば以下のようなスクリプトを実行してみます。

#! /bin/bash

sleep 3 &
echo $!
wait $!
echo done

sleepは指定した秒数動作を停止するコマンドです。こちらに&を付け加えることで3秒停止するコマンドをバックグランドで実行します。

その次に$!で上記コマンドでプロセスIDを出力し、上記コマンドが終了するまで待機するようにします。

終了後"done"の文字が表示されるようにしました。すると以下のように動作します。

$ ./test.sh
58
~3秒後~
done

バックグラウンドで動作するsleepコマンドのプロセスIDを出力し、3秒後doneの文字とともに再びコマンド入力ができるようになりました。


最後に$-ですが、こちらはフラグの出力に用います。例えば、

$echo $-
himBH

とすると上記のように現在のシェルで設定されているフラグが確認できます。

最後に

シェルスクリプトで度々登場する$軍団、毎回混乱しては調べていたので今回の学習はちょうどいい機会だったなと思いました。


特殊変数を使いこなしてスマートなスクリプトを作成したいものです…。


最後まで読んでいただきありがとうございました!


↓オススメ教材

shellscript

Posted by CY