変数と制御構造

 


変数(復習)

  • シェルスクリプトの変数は全て文字列型である.
  • 型宣言を行う必要はない.
  • 変数に値を代入する場合,= の前後に空白を入れてはいけない.   ABC="XYZ"   ABC = "XYZ"
  • 変数を評価する場合は,変数の先頭に $ を付ける.
  • 変数を評価する場合,変数名の区切りがあいまいな場合は,変数名を {} で括る.

 #!/bin/sh
 A="ABC"
 ABC="XYZ"
 echo $A
 echo $ABC
 echo ${A}BC


定数,実行結果(標準出力)の利用など

  • 定数も全て文字型です."で括った場合,中の変数は評価(展開)されます.'で括った場合,中のものを全て文字として扱う.
  • シェルスクリプトの中で,コマンドを `(グレイヴアクセント,アクサングラベ,shft+@)で括ると,その部分がそのコマンドの実行結果で置き換わる.

 #!/bin/sh
 dt=`date`
 echo "ただいまの時刻は  $dt"
 echo 'ただいまの時刻は  $dt'

  • read 変数 でキーボードから変数にデータを読み込める.
  • shift コマンドは引数を一つずらします.つまり $1 はなくなり,$2 が $1 に $3 が $2...になる.$#も一つ減る.
  • shift コマンドを使用しても $0(入力されたコマンドの文字列)は変化しない.
  • expr を使用すると,(数字としての)文字の算術計算ができる. 例) N=`expr $N + 1` (演算子は+,-,*,/,%が使用可能)

if文

  • if文の文法は

 if 条件式; then
     .......................................
 else
     .......................................
 fi

  • 条件式に [ ](条件式参照) を使用して,一行で命令を書く場合は if, then, fi は省略できる

 [ -x .bashrc ] && cat .bashrc 

  • キーワード if, then, else, fi と他の文字を続けて書かないこと.

while文

  • while文の文法は

 while 条件式; do
     ......................................
 done

  • キーワード while, do, done と他の文字を続けて書かないこと.

条件式の例

  • キーワード [, ] は他の文字を続けて書かないこと 空白が必要.
  • [ は一個のコマンドです. ls -l /usr/bin/[ で確かめてみよう.
    [ -d ディレクトリ ]        : 指定したディレクトリが存在するか? -d の前後に空白が必要
    [ -f ファイル ]           : 指定したファイルが存在するか? -f の前後に空白が必要
    [ -x ファイル ]          : 指定したファイルが存在して,かつ実行可能か? -x の前後に空白が必要
    [ 文字列1 = 文字列2 ]   : 文字列1と文字列2が等しいか? = の前後に空白が必要
    [ 文字列1 != 文字列2 ]  : 文字列1と文字列2は等しくない? != の前後に空白が必要
    [ 文字列1 -gt 文字列2 ] : 文字列1は数字として文字列2が大きい? -gt の前後に空白が必要
    [ 文字列1 -lt 文字列2 ]  : 文字列1は数字として文字列2より小さい? -lt の前後に空白が必要
    [ 文字列1 -ge 文字列2 ]: 文字列1は数字として文字列2が大きいか等しい? -ge の前後に空白が必要
    [ 文字列1 -le 文字列2 ] : 文字列1は数字として文字列2より小さいか等しい? -le の前後に空白が必要
  • 詳しくは man test で testコマンドのマニュアルを見る.

for文

  • for文の文法は

 for 変数 in データのリスト; do
     ............................................
 done


  • キーワード for, in, done は他の文字を続けて書かないこと
  • データのリストは,変数または定数を並べたもの
  • for文はデータのリストに列記されたデータを,一個一個変数に代入して処理を繰り前す.

 


以下の例を実際に実行しなさい.漫然と実行するのではなく,実行結果を予測し,なぜそのような結果になったか考えること

例と演習(if)

 #!/bin/sh
 # echo -n は改行しません.これはコメント行.漢字コード注意.
 echo -n "ファイル名を入力してください = "
 read fname
 if [ -f $fname ]; then
     echo "$fname は存在します."
     ls -l $fname
 else
     echo "$fname は存在しません."
 fi



例と演習(while)

 #!/bin/sh
 CNT="0"
 while [ $# != "0" ]; do
     echo "$* ($#)"
     CNT=`expr $CNT + 1`
     shift
 done
 echo "$CNT 回繰り返しました."



例と演習(for)

 #!/bin/sh
 CNT="0"
 echo $*
 for inp in $* ; do
     echo $inp
     CNT=`expr $CNT + 1`
 done
 echo "$CNT 回繰り返しました."





課題  この授業ページの課題から提出

  • 先週の getlines を改良し,指定した行を表示するようにしなさい.

    例)getlines 10 20 .cshrc .cshrc の10~20行を表示する.

  • キーボードから数を入力し,その数だけ * を一行で表示するプログラムを作りなさい.
  • キーボードから数を入力し,その数まで,表示する*を一行ごとに一個ずつ増やしていくプログラムを作りなさい.
 10 が入力された場合.
 *
 **
 ***
 ****
 *****
 ******
 *******
 ********
 *********
 **********
Last modified: Monday, 5 January 2015, 5:33 PM