サンプルシェルスクリプト4選で学ぶBashの特殊パラメータ
これまでのBashチュートリアルシリーズでは、位置パラメータ(ポジショナルパラメータ)について解説してきました。本記事では、実用的なシェルスクリプトのサンプルを交えながら、Bashの特殊パラメータについて詳しく見ていきます。
本記事で取り上げる主な特殊パラメータは以下のとおりです:$*、$@、$#、$$、$!、$?、$-、$_
$* と $@ の違い
位置パラメータの一覧全体にアクセスするには、$* と $@ の2つの特殊パラメータを使用します。ダブルクォートで囲まれていない場合、この2つはほぼ同等であり、どちらもスペース区切りの位置パラメータリスト("$1 $2 $3…")に展開されます。
しかし、ダブルクォートで囲んだ場合には両者の挙動が異なります。
"$*" は、IFS(Internal Field Separator)の最初の文字で区切られた1つの文字列 "$1c$2c$3…" として展開されます。
"$@" は、各パラメータが個別にクォートされた "$1" "$2" … "$N" として展開されます。
例1:$* と $@ で位置パラメータを展開する
この例では、$* と $@ に格納される値の違いを確認します。
まず、以下のように expan.sh を作成してください。
$ cat expan.sh #!/bin/bash export IFS='-' cnt=1 # Printing the data available in $* echo "Values of \"\$*\":" for arg in "$*" do echo "Arg #$cnt= $arg" let "cnt+=1" done cnt=1 # Printing the data available in $@ echo "Values of \"\$@\":" for arg in "$@" do echo "Arg #$cnt= $arg" let "cnt+=1" done
次に、expan.sh を実行して $* と $@ の動作を確認してみましょう。
$ ./expan.sh "This is" 2 3 Values of "$*": Arg #1= This is-2-3 Values of "$@": Arg #1= This is Arg #2= 2 Arg #3= 3
- 上記スクリプトでは、IFS(内部フィールドセパレータ)の値を「-」としてエクスポートしています。
- スクリプト expan.sh には3つの引数が渡されています。$1="This is"、$2="2"、$3="3" です。
- 特殊パラメータ "$*" を出力すると、IFSで区切られた位置パラメータ全体が1つの値として表示されます。
- 一方、"$@" は各パラメータを個別の単語として扱ってくれます。
例2:$# で位置パラメータの数を取得する
$# は、位置パラメータの個数を10進数で返す特殊パラメータです。
まず、以下のように arithmetic.sh を作成します。
$ cat arithmetic.sh #!/bin/bash if [ $# -lt 2 ] then echo "Usage: $0 arg1 arg2" exit fi echo -e "\$1=$1" echo -e "\$2=$2" let add=$1+$2 let sub=$1-$2 let mul=$1*$2 let div=$1/$2 echo -e "Addition=$add\nSubtraction=$sub\nMultiplication=$mul\nDivision=$div\n"
位置パラメータの数が2未満の場合、以下のように使用方法(Usage)が表示されます。
$ ./arithemetic.sh 10 Usage: ./arithemetic.sh arg1 arg2
例3:プロセス関連のパラメータ $$ と $!
特殊パラメータ $$ は、シェル自身のプロセスID(PID)を返します。$! は、直前にバックグラウンドで実行したプロセスのPIDを返します。
次のスクリプトは、シェルのプロセスIDと、最後に実行したバックグラウンドプロセスのIDを出力します。
$ cat proc.sh #!/bin/bash echo -e "Process ID=$$" sleep 1000 & echo -e "Background Process ID=$!"
スクリプトを実行し、表示されるプロセスIDを ps コマンドで確認してみましょう。
$ ./proc.sh Process ID=9502 Background Process ID=9503 $ ps PID TTY TIME CMD 5970 pts/1 00:00:00 bash 9503 pts/1 00:00:00 sleep 9504 pts/1 00:00:00 ps $
例4:その他の特殊パラメータ $?、$-、$_
- $?:直前に実行したコマンドの終了ステータスを返します。
- $-:set組み込みコマンドで設定されているオプションを返します。
- $_:直前のコマンドの最後の引数を返します。シェル起動時には、実行中のシェルスクリプトの絶対ファイル名が格納されます。
$ cat others.sh #!/bin/bash echo -e "$_"; ## Absolute name of the file which is being executed /usr/local/bin/dbhome # execute the command. #check the exit status of dbhome if [ "$?" -ne "0" ]; then echo "Sorry, Command execution failed !" fi echo -e "$-"; #Set options - hB echo -e $_ # Last argument of the previous command.
上記スクリプトでは、最後の echo 文である "echo -e $_"($_ はアンダースコア)も hB を出力します。これは直前のコマンドの最後の引数の値です。つまり、$_ は展開後の値を返すということになります。
$ ./others.sh ./others.sh /home/oracle Sorry, Command execution failed ! hB hB
-
シェルトレース活用ガイド:シェルスクリプトのコマンド実行をトレースしてデバッグする方法
シェルスクリプトデバッグシリーズの本記事では、3つ目のデバッグモードであるシェルトレース(shell tracing)について解説します。具体的な例を通じて、その仕組みと実際の使い方を見ていきましょう。 シリーズの前回までの記事では、残り2つのデバッグモードであるverboseモードと構文チェックモードについて、わかりやすい例とともにシェルスクリプトのデバッグを有効化する方法を紹介しました。 Linuxでシェルスクリプトのデバッグモードを有効にする方法 – Part 1 シェルスクリプトで構文チェックによるデバッグを行う方法 – Part 2 シェルトレースとは何か シェルトレースとは、シ
-
Bashシェル関数入門:実用的な6つのサンプル例で学ぶチュートリアル
Bashシェル関数とは、複数のUNIX/Linuxコマンドをひとつの名前でグループ化し、後からまとめて実行できるようにする仕組みです。Bashシェル関数は通常のUnixコマンドと同じように呼び出すことができ、現在のシェルコンテキスト内で実行されるため、解釈用の新しいプロセスを生成する必要がありません。bashのエイリアス(alias)と関数はどちらも、長いコマンドや複雑なコマンドに対するショートカットを定義するのに役立ちます。しかし、エイリアスでは制御フローや引数の扱いなど、関数ならではの高度な処理を行うことはできません。本記事では、その違いも含めて詳しく解説していきます。この記事は、進行中の