LinuCレベル1 102試験の例題と解説

1.06.2シェルスクリプト

今回は102試験の試験範囲から、「1.06.2 シェルスクリプト」についての例題
を解いてみます。

Linucレベル1 102試験 出題範囲


例題

以下のシェルの関数定義についての説明として、誤っているものを選択してください。

[関数定義]

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
}
  1. この関数の名前はsumである
  2. この関数は引数で渡された値の加算を行う
  3. この関数は、必ず2つの引数を取る
  4. この関数は、計算できない値が渡された場合に、戻り値として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を出力しています。

今回は、単純な加算を行う関数の例ですが、関数の定義や引数の渡し方、関数内部での引数の参照方法など、さまざまな要素が含まれています。理解できない箇所がある場合は、おさらいしておきましょう。


例題作成者

株式会社デージーネット ソリューション開発部    森 彰吾 氏

ページトップへ