Bashの$@,$#などの$から始まる特殊な変数について

スポンサーリンク

Bashには、$から始まる変数が色々とあります。ここでは$から始まる特殊な変数について紹介します。$から始まる変数はよく使うものもあり、専門的っぽく見えるので知っておくと便利だと思います。

スポンサーリンク

引数の展開について($@と$*と$#)

$@と$*の変数はシェルスクリプトの実行時に渡された引数をすべて展開または関数に渡された引数をすべて展開する変数として利用できます。
また、渡されている引数の数を確認するには$#の変数が利用できます。

$@と$*の変数は二重引用符で囲まれたときに動作が異なります。$@は個々の展開される引数がスペースで区切られて、二重引用符に囲まれている解釈を行います。
しかし、$*では、すべての引数が展開された状態を一つの文字列として扱います。
補足として、区切り文字を取り扱う組み込み変数IFSを変更すると、$*が展開されたときに引数を区切っていた文字が変更されます。

script1.sh

実行結果

 

コマンドの引数を処理するコマンドにはshiftコマンドがあります。shiftコマンドを実行すると'$@','$*','$#'の変数も変化します。

script2.sh

実行結果

 

 

 

コマンドの成功($?)

$?は直前のコマンドの終了ステータスを確認できます。終了ステータスは基本的に0が成功(正常)、それ以外が失敗(異常)になります。

script3.sh

実行結果

 

 

 

Bashのフラグの確認($-)

$-は実行しているBashについているフラグを確認できます。フラグはBashの起動時に付与できます。また、setコマンドでも変更を行うことができます。

script4.sh

実行結果

 

hBはデフォルトで付けられるフラグになります。hがコマンドの実行時に検索したそのコマンドのフルパスを記録する機能(hashコマンドの機能)です。Bがブレース展開(例:a{a,b,c}bでaaa,abb,acbに展開される機能)のフラグです。
付与したxとvのフラグは、xがコマンドのトレースを行うフラグで、vが入力したコマンドをそのまま出力するフラグになります。

 

 

 

プロセス関連($$と$!)

$$は現在のシェルのプロセスIDを取得できます。

 

$!は直前のバックグラウンドに移行したジョブのプロセスIDを取得できます。

 

 

 

実行中のシェルやシェルスクリプト名($0)

$0は実行中のシェルやシェルスクリプトの名前(実行コマンドの名前)を取得できます。

シェルで実行した場合

シェルスクリプト中で実行した場合

 

また、ファイル名だけを取得したい場合はbasenameコマンドを活用するといいと思います。

basename - ファイル名からサフィックスとディレクトリを除く
basenameコマンドは、ファイル名から.txtや.c等のサフィックスを取り除いたり、dir1/file.txtというファイルパスからdir1/を取り除き、file.txtという結果を得ることができます。

 

 

 

直前コマンドの最後の引数を呼び出し($_)

$_は直前のコマンドの末尾にある最後の引数の部分として展開されます。

$_が展開する直前のコマンドはシンプルコマンド(simple command)でこれはよく使われるコマンドの種類です。シンプルコマンドの区切りは改行のほかには‘||’, ‘&&’, ‘&’, ‘;’, ‘;;’, ‘;&’, ‘;;&’, ‘|’, ‘|&’, ‘(’, or ‘)’のようなものがあります。
$_を利用するよくある例として

のようなものがあります。これはディレクトリの作成に成功したらすぐにそのディレクトリに移動するものになります。
また、Gitで何かをクローンする際に

みたいに利用しても良いかもしれません。

 

 

 

参考

Bash Reference Manual