平成 25 年度 情報リテラシー 担当 : 一色正晴 (4 号館 405) isshiki@cs.ehime-u.ac.jp http://ipr20.cs.ehime-u.ac.jp/~isshiki/literacy/
先週の演習問題の解答 以下のワールドカード指定がどのような意味を持つか説明せよ 1. sample[0-9].dat sample で始まり, その後に 0~9 のいずれか一文字が続き,.dat で終わる文字列 2. tmp*.txt tmp で始まり,.txt で終わる文字列 3. check.{c,h} check.c と check.h 2
今日の内容 シェルスクリプトとは シェルスクリプトの基礎 作成のルール 実行のルール シェルスクリプトの作成 変数の利用 特殊文字のエスケープ 位置パラメータ 高度なシェルスクリプト 条件判定 分岐制御文 繰り返し制御文 3
シェルスクリプト CUI のスタイル 下のコメントも参照 シェルの動作 コマンドラインの操作と結果の表示の反復 一連のコマンド群をファイルに記述し, まとめて処理 ( バッチ処理 ) シェルスクリプト ファイルに記述されたコマンド群スクリプトのスタイル 条件分岐や繰り返し操作が可能 複雑な処理の自動化 CUI(Character-based User Interface) 文字とキーボードによるコンピュータの操作 情報技術者として必要なスキル ( マニュアル車の感覚 ) GUI(Graphical User Interface) 絵とマウスによるコンピュータの操作 一般ユーザの使い方 (AT 車の感覚 ) 4
どのシェルでスクリプトを書く? 複数のシェルが存在 (tcsh, bash, ) シェルによりスクリプトの構文が微妙に違う bash で書いたスクリプトを tcsh で実行できないかも tcsh または bash がインストールされていないかも bash や tcsh では汎用性に欠ける B シェルは大抵の UNIX 系システムに装備 ログインシェル ( 普段使うシェル ) 好みのシェル (tcsh, bash 等 ) シェルスクリプト B シェル 5
今日の内容 シェルスクリプトとは シェルスクリプトの基礎 作成のルール 実行のルール シェルスクリプトの作成 変数の利用 特殊文字のエスケープ 位置パラメータ 高度なシェルスクリプト 条件判定 分岐制御文 繰り返し制御文 6
スクリプト作成のルール コマンドを並べたテキストファイル 約束事 先頭行は #!/bin/sh で始める 先頭行以外の # 以下はコメント #!/bin/sh # # シェルスクリプトの例 (lr.sh) # カレントディレクトリのファイルを逆順に保存し, 表示 ls sort -r > filelist.txt cat < filelist.txt # 行末までコメント 7
スクリプトの実行のルール 方法 1: シェルを起動 % sh lr.sh 方法 2: 実行権限の付加 ( こちらが主流 ) % ls -l lr.sh -rw-r--r-- 1 foo foo 実行権限がない % chmod +x lr.sh パーミッションの変更 (p. 62) % ls -l lr.sh -rwxr-xr-x 1 foo foo %./lr.sh 実行権限が付加された ピリオド と スラッシュ と スクリプト名 で実行 8
今日の内容 シェルスクリプトとは シェルスクリプトの基礎 作成のルール 実行のルール シェルスクリプトの作成 変数の利用 特殊文字のエスケープ 位置パラメータ 高度なシェルスクリプト 条件判定 分岐制御文 繰り返し制御文 9
シェルスクリプトの作成 ( シェル変数 ) ユーザやファイルから受け取った値や, コマンドによって返された値を, 文字列として変数に保持 変数名の約束事 アルファベット, 数字, アンダースコア 数字からは始まらない 大文字と小文字は区別 変数へのデータの代入法と参照法 コマンド echo 1 行のテキストを表示 メッセージの表示に利用 #!/bin/sh # スクリプト variable1.sh DIR=/home い echo $DIR DATE=`date +%Y%m%d` echo $DATE 代入 : = の両側に空白を入れな 参照 : 変数名に $ を付ける コマンドの出力も代入できる 10
シェルスクリプトの作成 ( シェル変数 ) ユーザやファイルから受け取った値や, コマンドによって返された値を, 文字列として変数に保持 変数名の約束事 アルファベット, 数字, アンダースコア コマンド echo 数字からは始まらない 1 行のテキストを表示 コマンド展開 大文字と小文字は区別 メッセージの表示に利用コマンドをバック クォーテーション 変数へのデータの代入法と参照法 (shift+@) で囲むと, 実行結果が通常の文字列として扱われる. #!/bin/sh date コマンドの結果を変数 DATE に代入している # スクリプト variable1.sh DIR=/home い echo $DIR DATE=`date +%Y%m%d` echo $DATE 代入 : = の両側に空白を入れな 参照 : 変数名に $ を付ける コマンドの出力も代入できる 11
シェルスクリプトの作成 ( シェル変数 ) シェル変数の参照における注意事項 変数の参照と文字列連結の組合わせには要注意!! #!/bin/sh # スクリプト variable2.sh DIR=/home echo $DIR echo $DIR1 echo ${DIR}1 変数 DIR に, 文字列 /home を格納 変数 DIR の内容 /home を表示 変数 DIR1 の内容を表示せよ と解釈 変数 DIR の内容と 1 を連結して表示 12
シェルスクリプトの作成 ( シェル変数 ) シェル変数の参照における注意事項 変数の参照と文字列連結の組合わせには要注意!! #!/bin/sh # スクリプト variable2.sh DIR=/home echo $DIR echo $DIR1 echo ${DIR}1 変数 DIR に, 文字列 /home を格納 変数 DIR の内容 /home を表示 変数 DIR1 の内容を表示せよ と解釈 変数 DIR の内容と 1 を連結して表示 変数 DIR1 が以前に定義されていなければ, 何も表示されない 13
シェルスクリプトの作成 ( シェル変数 ) 注意事項 既に定義されている変数が幾つか存在 各種アプリケーションで使用 代入できないが参照は可能 PATH コマンドディレクトリ SHELL 現在使用しているシェル USER ユーザ名 PWD 現在の絶対パス名 UID ユーザID OLDPWD 移動前の絶対パス名 HOME ユーザのホームディレクトリ LANG 言語指定 HOSTNAME ホスト名 PPID 親プロセスのプロセスID これらの変数名の使用は避ける! 14
シェルスクリプトの作成 ( エスケープ ) * や $ などの特殊文字を, 単なる文字と扱いたい その場合, 特殊性の無効化 ( エスケープ ) が必要 バックスラッシュを直前に付加 シングルクオートで囲む ( 変数参照 ファイル名展開もエスケープ ) ダブルクオートで囲む ( 変数参照 ファイル名展開は有効 ) #!/bin/sh # スクリプト escape.sh echo User name is $USER echo User name is $USER echo User name is $USER echo User name is $USER ユーザ名が表示 $USER と表示 $USER と表示 ユーザ名が表示 はバックスラッシュ 15
シェルスクリプトの作成 ( 位置パラメータ ) コマンドライン引数を, 位置パラメータ と呼ばれる特殊変数に格納可能 参照方法 1 9 番目の引数 $1 $9 スクリプト名 $0 引数の数 $# ファイル名やディレクトリ名, オプションを引数として与えて処理できる #!/bin/sh # スクリプト clpar.sh echo 1st parameter: $1 echo 2nd parameter: $2 echo shell script: $0 echo number of parameters: $# 16
シェルスクリプトの作成 ( 位置パラメータ ) コマンドライン引数を, 位置パラメータ と呼ばれる特殊変数に格納可能 参照方法 1 9 番目の引数 $1 $9 スクリプト名 $0 引数の数 $# % chmod +x clpar.sh 実行権限の付与 %./clpar.sh aaa bbb スクリプトの実行 1st parameter: aaa 第 1 引数 aaa が表示 2nd parameter: bbb 第 2 引数 bbb が表示 shell script: clpar.sh スクリプト名が表示 number of parameters: 2 引数の個数が表示 17
演習 スライドに示したシェルスクリプトのサンプルを作成 実行して, 内容の確認 理解をする. nkf コマンドで漢字コードと改行コードを Windows UNIX へ変換する際, 変換元と変換先のファイル名が異なっている必要がある. したがって, ファイル名を変えずにコードのみを変換するには, 例えば, 次のように % nkf -ed filename.txt > filename_euc.txt % mv filename_euc.txt filename.txt と,2 つのステップが必要である.1 つのステップで行うためのシェルスクリプト kconv.sh を作成せよ. なお, 書式は %./kconv.sh [ 対象ファイル名 ] とする. 18
今日の内容 シェルスクリプトとは シェルスクリプトの基礎 作成のルール 実行のルール シェルスクリプトの作成 変数の利用 特殊文字のエスケープ 位置パラメータ 高度なシェルスクリプト 条件判定 分岐制御文 繰り返し制御文 19
シェルスクリプトの作成 ( 条件判定 ) 条件分岐や繰り返し文では, ある条件に合致するか否かの判断が必要 test コマンドで実現 条件が正しいとき 真 (0 の値 ) 条件が誤っている 偽 (0 以外の値 ) $? は特殊変数で, 直前のコマンドが返す値を保存 正常終了 :0 異常終了 :1 #!/bin/sh # スクリプト condition.sh test -f condition.sh echo $? test -f hogehoge.txt echo $? ファイルが存在するので 0 を表示 ファイルが存在しないので 1 を表示 20
シェルスクリプトの作成 ( 条件判定 ) 条件分岐や繰り返し文では, ある条件に合致するか否かの判断が必要 test コマンドで実現 条件が正しいとき 真 (0 の値 ) 条件が誤っている 偽 (0 以外の値 ) test コマンドの簡略版で, スクリプト内で見易い #!/bin/sh # スクリプト condition.sh [ -f condition.sh ] [ の後と ] の前には空白を挿入 echo $? ファイルが存在するので 0 を表示 [ -f hogehoge.txt ] echo $? ファイルが存在しないので 1を表示 21
シェルスクリプトの作成 ( 分岐制御文 ) 単純な分岐処理 if 条件式 then 処理 fi 条件式 真 処理 偽 例 : ファイルが存在するか否かで分岐 #!/bin/sh # スクリプト branch1.sh if [ -f $1 ] then fi echo The $1 exists. #!/bin/sh # スクリプト branch1.sh if [ -f $1 ]; then fi echo The $1 exists. 22
シェルスクリプトの作成 ( 分岐制御文 ) 複数方向への分岐処理 if 条件式 ; then 処理 1 else 処理 2 fi 条件式 真 処理 1 偽 処理 2 #!/bin/sh # スクリプト branch2.sh if [ -f $1 ]; then echo The $1 exists. else fi echo The $1 does not exist. 23
シェルスクリプトの作成 ( 繰り返し制御文 ) 同じ処理の繰り返し for 変数 in 複数の文字列 ; do 処理 done in の後の文字列が左から, 変数に格納 処理 内で参照可能 月の表示 繰り返し 処理 繰り返し #!/bin/sh # スクリプト loop.sh for month in Jan Feb Mar Apr; do echo Month : $month. done 24
スクリプトの保存場所 自作した汎用性のあるスクリプトの保存 chmod コマンドで実行可能形式に変換 ~/bin 以下に保存 コマンド検索パスの設定ホームディレクトリ内の設定ファイル.bashrc に export PATH=$PATH:$HOME/bin を付加 = の両側に空白入れない 通常のコマンド同じように使用可能 25
演習問題 第 10 回 : シェルスクリプト スクリプト kconv.sh を完成させよ 作成した kconv.sh を, 分岐制御文や繰り返し制御文を使って, より便利なスクリプトに改良せよ. 26