準備 • /binを作成し、検索パスに追加 計算機科学概論 ‒ ホームディレクトリにディレクトリbinを作成 % cd; mkdir bin ‒ gmituhar/math/lecture/cs/bin/showargsを /binにコピー 第5回 % cp ~gmituhar/math/lecture/cs/bin/showargs ~/bin シェルスクリプト ‒ /.cshrcの「source /g/admin/etc/Cshrc」の 次の行に、以下の内容を追加 •set path = ( ~/bin $path ) ‒ % source ~/.cshrcを実行 シェルスクリプト 引数の処理 • シェルに与えるコマンドの列を記述したもの ‒ 最初の行を「#!/bin/sh」とし、ファイルを実行可 能にしておけば、コマンドのように実行できる • 様々な用途 ‒ プログラミング言語を持ち出すまでもない作業 ‒ 決まりきった手順の作業 ‒ ちょっとした前処理をしてからのコマンドの実行 ‒ コマンドを組み合わせて使う ‒ 出来合いのコマンドを自分好みに変更 ‒ 通常のプログラミング言語が使用できないとき •$n(n=1∼9)がn番目の引数に置換される –$0はコマンドのパス名 –$#は引数の数 •add: #!/bin/sh sum=`expr $1 + $2` echo "$1 + $2 = $sum" % ./add 2 3 引数の処理 引数の処理 •setで直接$1, $2, … に値を設定すること • 「$*」や「$@」は「$1 $2 … 」 • 「"$*"」は 「"$1 $2 … "」 も可能 • 「"$@"」は 「"$1" "$2" … 」 ‒Cシェルのsetとは違う ‒ argstest: #!/bin/sh echo '$*';! echo '$@';! echo '"$*"';! echo '"$@"';! % ./argstest "a b" 'c showargs showargs showargs showargs d *' $*; ! echo $@;! echo "$*"; echo "$@" $ set first second third $ echo $# $3 $2 $1 オプションの処理 •shiftで$nの内容が一つずつ前にずれる ‒10番目の引数が$9の値となる $ set first second third $ shift $ echo $# $1 $2 makebak クオート使用版 shift shift shift shift shift ;; ;; ;; ;; ;; 問題2 「in "$@"」 は省略可 #!/bin/sh for f in "$@" do cp "$f" "$f.bak" done #!/bin/sh for f in $* do cp $f $f.bak done • greet: #!/bin/sh msg=Hello case $1 in -m)! msg="Good morning";!! -a)! msg="Good afternoon";! -e)! msg="Good evening";!! -n)! msg="Good night";! ! -g)! msg="$2";!! shift; esac name=${1:-`whoami`} echo "$msg, $name." –$#の値も1減る • 参考書版(危険) オプションの処理 • 引数に空白や「*」が入る場合を想定 ‒ Cf. iTunes2の事例 • showargsと同じ働きをするシェルスクリ プトshowargs.shを作成せよ • 以下のような場合も正しく動くように ‒引数を10個以上与えたとき ‒引数に空白や「*」が含まれるとき • まだ完璧ではない ‒ 引数にcpのオプションと混同されるものが来たら? 問題3a • 以下のようなコマンドmakereadableを作成せよ ‒ % makereadable [-u] [-g] [-o] [-a] パス 名1 … パス名n ‒ パス名が通常のファイルを表していれば読み出し許 可を付加、ディレクトリであれば読み出し許可と検 索許可を付加 ‒ 許可を与える対象はオプションで指定 ‒ ヒント: testコマンドを使う ‒ 自分で調べられれば、getoptsでオプションの解析 をしてもよい 問題3b • 選択問題 • 問題3aに、ディレクトリを再帰的に処理 するオプション-Rを追加せよ ‒「.」で始まるファイル名、ディレクトリ名は 対象にしなくてよい ‒もし対象にする場合は「.」と「..」の扱いに十 分注意すること!! •テスト段階では実際に実行するのではなく、何が 実行されるのかを表示するようにしておく
© Copyright 2024 ExpyDoc