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

105.1 シェル環境のカスタマイズと使用

今回は102試験の試験範囲から、「105.1 シェル環境のカスタマイズと使用」についての例題
を解いてみます。

■トピックの概要
このトピックの内容は以下の通りです。

<105.1 シェル環境のカスタマイズと使用>
重要度 4

<説明>
ユーザの要求に応じてシェル環境をカスタマイズできる。全体のプロファイルおよびユーザのプロファイルを変更する。

<主要な知識範囲>
・ログイン時または新しいシェルを生成したときに、環境変数(PATHなど)を設定する
・よく使用する一連のコマンド用にBashの関数を作成する
・新しいユーザアカウント用のスケルトンディレクトリを保守する
・コマンドサーチパスを適切なディレクトリに設定する

<重要なファイル、用語、ユーティリティ>
.
source
/etc/bash.bashrc
/etc/profile
env
export
set
unset
~/.bash_profile
~/.bash_login
~/.profile
~/.bashrc
~/.bash_logout
function
alias
lists

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

[関数定義]
------------------------------------------------------------------------------------------
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 関数名 {
    実行するコマンド
}
------------------------------------------------------------------------------------------

定義した関数は、コマンドと同じように実行できます。
例題の関数は以下のように実行できます。

------------------------------------------------------------------------------------------
$ sum 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を出力しています。

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

■例題作成者
株式会社デージーネット ソリューション開発部    森 彰吾 氏

ページトップへ