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

1.06.2シェルスクリプト

LinuCレベル1 102試験の出題範囲から「1.06.2 シェルスクリプト」についての例題を解いてみます。
ここでは、特殊なシェル変数について確認しておきましょう。

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


例題

以下の関数は、2つの引数を受け取り、減算した結果を標準出力に出力します。
この関数を利用して、標準出力に3を出力する方法として正しいものを1つ選択してください。

function sub()
{
    if [ $# -ne 2 ]
    then
        echo 'ERROR: 引数の数が正しくありません。'
        return 1
    fi
    
    expr $1 - $2
    return 0
}
  1. sub(5, 2)
  2. sub 2 5
  3. sub 5 2
  4. sub 6 2 1

※この例題は実際の試験問題とは異なります。


解答と解説

正解は、「3. sub 5 2」です。

初めに、シェル変数とコマンドライン引数について解説します。

シェル変数とは、シェルのコマンドラインで変数名と値を定義し、参照や更新が行えるものです。定義したシェル変数は変数名の先頭に$をつけることで参照することができます。

$ test=10
$ echo $test
10 -> 定義した値が参照される

$ test=20
$ echo $test
20 -> 後から定義した値に更新される

コマンドライン引数とは、コマンドやプログラムを実行する際に指定する文字列のことです。例えばコマンドラインで以下を入力した場合、コマンドライン引数は1とtestになります。

$ echo 1 test

シェルスクリプトでコマンドライン引数を扱うには、特殊なシェル変数を利用します。

・$#
コマンドライン引数の数になります。

[test.sh]

#!/bin/bash
echo $#
$ bash test.sh 1 2 3
3

・$*
コマンドライン引数を全て参照します。
ダブルクォーテーションで囲むことで、1つの文字列として扱うことができます。

[test.sh]

#!/bin/bash
for line in "$*"
do
    echo $line
done
$ bash test.sh 1 2 3
1 2 3

・$@
コマンドライン引数を全て参照します。
$*と異なり、ダブルクォーテーションで囲んだ場合でも、コマンドライン引数を個別の文字列として扱います。

[test.sh]

#!/bin/bash
for line in "$@"
do
    echo $line
done
$ bash test.sh 1 2 3
1
2
3

・$0
実行しているコマンド名になります。

[test.sh]

#!/bin/bash
echo $0
$ bash ./test.sh
./test.sh

・$1..$n
コマンドライン引数が左から、$1,$2,$3の順番で割り当てられます。
$1には第1引数、$2には第2引数、$3には第3引数、$nには第n引数が割り当てられます。

[test.sh]

#!/bin/bash
echo $1 $2 $3
$ bash test.sh 1 2 3
1 2 3

・shift
shiftはシェル変数ではありませんが、前述の$1..$nを扱うコマンドです。
コマンドの書式は以下になります。

shift [数字]

shiftコマンドを実行すると、指定した数字だけコマンドライン引数を左にシフトします。
例えば、shift 3を実行した場合、$1には第4引数、$2には第5引数、$3には第6引数…$nには第n+3引数が割り当てられます。

shiftのみ実行した場合、1を指定したことになります。

[test.sh]

#!/bin/bash
echo $1 $2 $3 $4 $5 $6
shift 3
echo $1 $2 $3
$ bash test.sh 1 2 3 4 5 6
1 2 3 4 5 6
4 5 6

この他にもコマンドライン引数に関わる特殊なシェル変数は存在しますので、併せて確認しておきましょう。また、シェルスクリプト内で実行した関数の引数もコマンドライン引数と同様に扱うことができます。

次に、例題の関数について解説します。

function sub()
{
    if [ $# -ne 2 ] ------------------------------①
    then
        echo 'ERROR: 引数の数が正しくありません。'
        return 1
    fi
    
    expr $1 - $2    ------------------------------②
    return 0
}

この関数は引数で渡された値を減算して標準出力に出力します。
番号ごとに処理の解説をします。

①: $#は引数の数です。例題の関数では、引数の数が2ではない場合に標準出力にエラーを出力し、戻り値で1を返します。

②: exprコマンドは式を評価するコマンドです。$1は第1引数、$2は第2引数を参照します。

ここではexprコマンドで、$1から$2を減算する式を評価して、結果を標準出力に出力しています。exprコマンドで評価できる式は多数ありますので、併せて確認しておきましょう。

例題の選択肢について解説します。

1.sub(5, 2)
不正解です。

シェルスクリプトでは、引数の指定に括弧は必要ありません。

2.sub 2 5
不正解です。

例題の関数は第1引数に指定した値から第2引数に指定した値を減算します。第1引数に指定した2から第2引数に指定した5を減算した結果の-3が標準出力に出力されます。

3.sub 5 2
正解です。

第1引数に指定した5から第2引数に指定した2を減算した結果の3が標準出力に出力されます。

4.sub 6 2 1
不正解です。

前述した①の解説の通り、例題の関数は引数の数が2ではない場合、標準出力にエラーメッセージを出力します。

コマンドライン引数を扱うことのできる特殊なシェル変数を理解することで、様々な処理を行えるようになります。
適切に扱えるように使い方を理解しておきましょう。


例題作成者

株式会社デージーネット OSS研究室 宮地 智哉

ページトップへ