シェルスクリプトを使ってみる③

概 要

シェルスクリプトについて勉強したことを記録しておきます。

特殊変数

シェルスクリプトの引数は特殊変数に格納されます。知らないとサンプルプログラムなどを見るときに突然現れた変数に途惑うことになるので、メモしておきます。下図左側に特殊変数を使ったシェルスクリプトと右側に実行例を示します。

特殊変数について下表に示します。

特殊変数 内 容
$0 シェルスクリプトファイル名
$1~$n 1~n番目の引数
$# 引数の数
$* 1~n番目の全ての引数
$? 終了ステータス(0:成功,1:失敗)
$$ 実行時のプロセス番号

 

配列

配列の使い方です。次のスクリプトでは、3つの要素が格納された配列の内容を表示後、要素を追加・削除し、いくつか異なる方法で配列の内容を表示しています。スクリプト内のコメントと実行結果で処理内容と結果は理解出来ますので細かい説明は省略します。配列の要素を削除すると“空き”状態の様になる様です。結果、配列表示(3)(4)(5)は同じ配列を表示していますが、(4)では、array[2] が空きになって、array[5] の内容が表示されていません。“空き”要素をつめることは出来ないらしく、全て削除し、再度設定する処理が必要の様です。

#!/bin/bash

array=("bbb" "ccc" "ddd")	#初期配列定義
echo ""

echo "配列表示(1)"
i=0
for e in ${array[@]}; do
    echo "array[$i] = ${e}"
    let i++
done
echo "${#array[*]}"		#配列要素数表示
echo ""

array=("aaa" "${array[@]}")	#前に配列要素追加
array=("${array[@]}" "eee")	#後に配列要素追加
array+=( "fff" )  		#後に配列要素追加

echo "配列表示(2)"
for ((i = 0; i < ${#array[@]}; i++)) {
    echo "array[$i] = ${array[i]}"
}
echo "${#array[@]}"		#配列要素数表示
echo ""

unset array[2]			#3つ目の要素削除

echo "配列表示(3)"
i=0
for e in ${array[@]}; do
    echo "array[$i] = ${e}"
    let i++
done
echo ""

echo "配列表示(4)"
for ((i = 0; i < ${#array[@]}; i++)) {
    echo "array[$i] = ${array[i]}"
}
echo ""

echo "配列表示(5)"
echo "${array[@]}"
echo "${#array[@]}"            #配列要素数表示
echo ""

unset array[@]                 #全削除

echo "配列表示(6)"
echo "${array[@]}"             
echo "${#array[@]}"            #配列要素数表示
echo ""

array[2]="aaa"		       #配列追加
array[3]="bbb"		       #配列追加

echo "配列表示(7)"
echo "${array[@]}"
echo "${#array[@]}"            #配列要素数表示
echo ""

実行結果は下記の通りです。

分岐処理( if )

分岐処理( if )の使い方です。

#!/bin/bash

echo ""

if [ $# -eq 2 ] ; then

    rtn_calc=$1*$2	#面積計算

    if [ $1 -ge $2 ] ; then
	echo "長辺:$1 , 短辺:$2"
    else
	echo "長辺:$2 , 短辺:$1"
    fi

    echo -n "長方形面積:"
    echo "scale=2; $rtn_calc" | bc
    echo ""

else
    echo "長方形面積計算には、2つのパラメータが必要です。"
    echo ""
    exit 1

fi

exit 0

実行結果です。(上側:成功例,下側:パラメータ未設定)

ただ、このままだと少数のパラメータ(引数)には対応していないことが判りました。下記の様に修正します。

#!/bin/bash

echo ""

if [ $# -eq 2 ] ; then

    rtn_calc=$1*$2	#面積計算

    res=`echo "$1 > $2" | bc`

    if [ $res -eq 1 ] ; then
	echo "長辺:$1 , 短辺:$2"
    else
	echo "長辺:$2 , 短辺:$1"
    fi

    echo -n "長方形面積:"
    echo "scale=2; $rtn_calc" | bc
    echo ""

else
    echo "長方形面積計算には、2つのパラメータが必要です。"
    echo ""
    exit 1

fi

exit 0

実行例です。上側は修正前スクリプトで少数を引数として渡すと、アラームが発生し、長編と短辺の判定に失敗しています。
一方、下側の修正プログラムでは、判定に成功しています。

まとめ

配列の要素削除,少数の判定などの他にも知らないで使っていると、意図しない処理をしてしまう様なことが他にもありそうな印象を持ちました。留意しておきたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です