LinuCレベル1 102試験の例題と解説
1.06.2シェルスクリプト
今回は102試験の試験範囲から、「1.06.2 シェルスクリプト」についての例題
を解いてみます。
例題
以下のシェルの関数定義についての説明として、誤っているものを選択してください。
[関数定義]
function sum() {
total=0
if [ $# -lt 2 ]
then
echo "Usage: sum 1 2"
return 1
fi
for num in $@
do
total=`expr $total + $num`
if [ $? -ne 0 ]
then
echo "Invalid number: $num"
return 2
fi
done
echo $total;
return 0
}
- この関数の名前はsumである
- この関数は引数で渡された値の加算を行う
- この関数は、必ず2つの引数を取る
- この関数は、計算できない値が渡された場合に、戻り値として2を返す
※この例題は実際の試験問題とは異なります。
解答と解説
答えは「3. この関数は、必ず2つの引数を取る」です。
まず、シェルの関数の定義と実行方法についてです。
関数は以下のように定義します。
function 関数名() {
実行するコマンド
}
以下のようにfunctionや()を省略して定義することもできます。
なお、両方とも省略することはできません。
関数名() {
実行するコマンド
}
function 関数名 {
実行するコマンド
}
定義した関数は、コマンドと同じように実行できます。
例題の関数は以下のように実行できます。
um 1 2 3
6
次に例題の関数のポイントを解説します。
function sum() {
total=0
if [ $# -lt 2 ] ------------------ 1
then
echo "Usage: sum 1 2"
return 1
fi
for num in $@ ------------------ 2
do
total=`expr $total + $num` ------------------ 3
if [ $? -ne 0 ]
then
echo "Invalid number: $num"
return 2
fi
done
echo $total; ------------------ 4
return 0
}
この関数は、例題の選択肢にもあるように、引数で渡された数値を加算して出力する関数です。
処理毎に振った番号毎に、解説していきます。
1. $#には、関数に渡された引数の数が代入されています。この例の場合、2より小さい場合はエラーとして、戻り値で1を返します。2つ以上の引数を取ることができるため、選択肢「3. この関数は、必ず2つの引数を取る」は誤りになります。
2. $@には、関数の引数がすべて渡されます。渡された引数をfor文でひとつずつ変数numに代入してループ処理を行います
3. 変数totalに変数numの値を加算しています。加算に失敗した場合、エラーとして戻り値で2を返します
4. すべての引数の加算が終わった変数totalを出力しています。
今回は、単純な加算を行う関数の例ですが、関数の定義や引数の渡し方、関数内部での引数の参照方法など、さまざまな要素が含まれています。理解できない箇所がある場合は、おさらいしておきましょう。
例題作成者
株式会社デージーネット ソリューション開発部 森 彰吾 氏