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

105.2簡単なスクリプトのカスタマイズまたは作成

今回は、LinuC 102試験の試験範囲から「105.2 簡単なスクリプトのカスタマイズまたは作成」についての例題を解いてみます。
シェルスクリプトを作る上で、プロンプト入力でスクリプト続行か終了かを制御できるreadコマンドはとても便利です。動作を理解しておきましょう。

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


例題

以下のシェルスクリプトの説明として、誤っているものを選択してください。

 1行目  #!/bin/bash
 2行目  
 3行目  while true
 4行目  do
 5行目      echo "This calculate (x * y)."
 6行目      read -p "Input x = " x
 7行目      read -p "Input y = " y
 8行目      echo "x * y = `expr $x \* $y`"
 9行目  
10行目      read -p "別の計算をしますか? [Y/n]" yesno
11行目      if [ "$yesno" != "Y" ];then
12行目          echo quit.
13行目          exit 0
14行目      fi
15行目  done
  1. プロンプトに「Input x = 」と表示し、ユーザに x の値の入力を求める
  2. プロンプトに「Input y = 」と表示し、ユーザに y の値の入力を求める
  3. x, y の値を入力すると、標準出力に「x * y = 」とともに、x と y の掛け算の結果を出力する
  4. プロンプトに「別の計算をしますか? [Y/n]」と表示された際、「Y」 と入力すればスクリプトが終了する

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


解答と解説

正解は「4. プロンプトに「別の計算をしますか? [Y/n]」と表示された際、「Y」 と入力すればスクリプトが終了する」です。

read コマンドは、標準入力から1行読みこんで、変数に格納することができます。
readコマンドの構文は以下の通りです。

read [-p PROMPT_STRING] [VAR1] [VAR2] ...

「-p PROMPT_STRING」をつけて実行すると、PROMPT_STRING をプロンプトとして表示します。
VAR1、VAR2、… には、ユーザが標準入力に入力した値が代入されます。

下記の例では、「read VAR1 VAR2」 を実行した例です。

(例1)
ユーザの標準入力が「arg1」 であった場合、
VAR1=arg1, VAR2="" が代入されます。

(例2)
ユーザの標準入力が「arg1 arg2」 であった場合、
VAR1=arg1, VAR2=arg2 が代入されます。

(例3)
ユーザの標準入力が「arg1 arg2 arg3」 であった場合、
VAR1=arg1, VAR2="arg2 arg3" が代入されます。

また、VAR1、VAR2、… を省略して実行した場合、ユーザの入力は捨てられます。

次に、例題のスクリプトをコメント行で解説します。

1行目  #!/bin/bash
2行目
3行目  while true

#無限ループします。

4行目  do
5行目      echo "This calculate (x * y)."
6行目      read -p "Input x = " x

#プロンプトを表示し、ユーザに x の値の入力を求めます

7行目      read -p "Input y = " y

#プロンプトを表示し、ユーザに y の値の入力を求めます

8行目      echo "x * y = `expr $x \* $y`"

#入力された x と y の値の掛け算を行い、標準出力に出力します。
#ただし、x と y は整数でなければ計算は失敗します。

9行目
10行目      read -p "別の計算をしますか? [Y/n]" yesno

#プロンプトを表示し、ユーザの入力を変数 yesno に代入します

11行目      if [ "$yesno" != "Y" ];then

変数 yesno の値が 「Y」でなければ、スクリプトを終了します。

12行目          echo quit.
13行目          exit 0
14行目      fi
15行目  done

例題の選択肢を一つずつ見ていきましょう。

[1. プロンプトに「Input x = 」と表示し、ユーザに x の値の入力を求める]
正しいです。6行目のread コマンドで「Input x = 」というプロンプトを表示し、x の値の入力を求めています。

[2. プロンプトに「Input y = 」と表示し、ユーザに y の値の入力を求める]
正しいです。7行目のread コマンドで「Input y = 」というプロンプトを表示し、y の値の入力を求めています。

[3. x, y の値を入力すると、標準出力に「x * y = 」とともに、x と y の掛け算の結果を出力する]
正しいです。8行目の「`expr $x \* $y`」 によって x と y の掛け算が実行され、echo コマンドで標準出力に「x * y = 」とともに掛け算の結果が出力されます。

[4. プロンプトに「別の計算をしますか? [Y/n]」と表示された際、「Y」 と入力すればスクリプトが終了する]
誤りです。「Y」を入力するとループの最初から実行されます。「Y」以外を入力することで、スクリプトは終了します。


例題作成者

株式会社デージーネット OSS研究室 後藤 慎司

ページトップへ