計算機科学概論 準備 シェルスクリプト 引数の処理 引数の処理 引数の

準備
• /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を追加せよ
‒「.」で始まるファイル名、ディレクトリ名は
対象にしなくてよい
‒もし対象にする場合は「.」と「..」の扱いに十
分注意すること!!
•テスト段階では実際に実行するのではなく、何が
実行されるのかを表示するようにしておく