シェルスクリプト その2
Completion requirements
変数と制御構造
変数(復習)
- シェルスクリプトの変数は全て文字列型である.
- 型宣言を行う必要はない.
- 変数に値を代入する場合,= の前後に空白を入れてはいけない. ○ ABC="XYZ" X 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