Successfully reported this slideshow.
第0回L-1グランプリ bash    よくに変わったところはない            のがたじゅん <nogajun@gmail.com>                     2012.11.17 姫路 IT 系勉強会
自己紹介
のがたじゅん
なんとかかんとかうだうだにゃーにゃ
以下略
bashとは
パールのようなもの     perl より重く、 perl より不器用。はっきり言って似ていない     が、上記「特徴」 (※ 下記リンク参照 ) にはよく当てはまる     ( 電卓代わりに起動される事は無い。 bc を使いたまえ、いい  ...
お題1.FizzBuzz
おソース#!/bin/bashfizzbuzz(){  NUM=""  (($1 % 3 == 0)) && NUM=${NUM}Fizz ←3 で割り切れた時 NUM に Fizz が入って  (($1 % 5 == 0)) && NUM=$...
算術式展開とリスト算術式展開を使うとexprを使わなくても計算できる。expr 1 + 1こういう風に書ける$((1 + 1))リストを使うと条件判定ができる。command1 && command2 command1の終了ステータスが0を返す...
プレース展開プレース展開を使うと任意の文字列が生成できる。$ echo {A..Z}ABCDEFGHIJKLMNOPQRSTUVWXYZ/usr/local/foo,bar,buzzの三つのディレクトリを作成する場合mkdir /usr/loc...
お題2.GPA(Grade Point Average)
おウスターソース  #!/bin/bash  N=$(head -n1 $1)  S=$(tail -n1 $1)  A=$(echo   ${S}|tr   -d   [BCDF])  B=$(echo   ${S}|tr   -d   [A...
パラメータの展開通常$Aと書くところを${#A}と書くと$Aの文字数を返します。ABCDFが混ざった文字列から不要な文字BCDFを消してAだけにする。A=$(echo ${S}|tr -d [BCDF])変数$Aには「A」の文字列しか入ってない...
あれ?出力実行例2.79412bc に投げた例2.79411てことで、 man bc を見てみると…
数bc における最も基本的な要素は  数  です。数は、整数部と小数部があり、任意の精度をとることができます。すべての数は、内部では 10 進数で表現されており、 計算も 10 進数で行われます。 ( 本バージョンでは、除算と乗算で結果に切捨て...
お題3.「tail -n 5」相当の動作を     するプログラム
おトンカツソース#!/bin/bash                                # while version                                           while_version...
最初に考えたバージョンtail -n 5 hoge.txt      これは、おこられる…
次に考えたバージョンsed 1,( 行数 -n) d hoge.txt         bash やなくて sed やし…
がんばってみた i=1 while read LINE;do  [ ${i} -gt ( 行数 -n) ] && echo "${LINE}"  let ++i done < ${FILENAME}「 tac を使って逆順に読んで配列に放り込ん...
結果本家 tail$ time tail -n5 questions.mdreal    0m0.004suser    0m0.004ssys     0m0.000ssed バージョン$ time ./tail.sh -n 5 questi...
本家使えあとBashはループさせたら負けあとBashはループさせたら負け
Bashのよいところ
Linuxなら大抵ある
zshさいこーという人もいるけど
いちいち切り替えるのめんどくさくないですか ? オプション補完はbash-completion使えば補完されるしプレース展開もできる からるしプレース展開もできるzsh使う意味なくね?
ちなみにヒストリー共有は.bashrc あたりにこんな風に書いておくとおk。引用元 : iandeth. - bash にて複数端末間でコマンド履歴 (history) を共有する方法 :http://iandeth.dyndns.org/mt...
バグ
man bash
bash は大きすぎるし、遅すぎます。Its too big and too slow.
知ってた
おあとがよろしいようで
Upcoming SlideShare
Loading in …5
×

姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash

1,306 views

Published on

姫路IT系勉強会 Vol.11 第0回L-1グランプリで発表したスライドです。
https://sites.google.com/site/himejiitstudy/2012/20121117

Published in: Technology
  • Be the first to comment

姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash

  1. 1. 第0回L-1グランプリ bash よくに変わったところはない のがたじゅん <nogajun@gmail.com> 2012.11.17 姫路 IT 系勉強会
  2. 2. 自己紹介
  3. 3. のがたじゅん
  4. 4. なんとかかんとかうだうだにゃーにゃ
  5. 5. 以下略
  6. 6. bashとは
  7. 7. パールのようなもの perl より重く、 perl より不器用。はっきり言って似ていない が、上記「特徴」 (※ 下記リンク参照 ) にはよく当てはまる ( 電卓代わりに起動される事は無い。 bc を使いたまえ、いい 子だから ) 。 変数 a の値を b に代入したい時には「 b=$a 」と書く。 大きなお友達は数え切れないが、自分が大きくなることは稀 なピーターパンである。パールのようなもの - アンサイクロペディア :http://ja.uncyclopedia.info/wiki/%E3%83%91%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E3%82%82%E3%81%AE
  8. 8. お題1.FizzBuzz
  9. 9. おソース#!/bin/bashfizzbuzz(){ NUM="" (($1 % 3 == 0)) && NUM=${NUM}Fizz ←3 で割り切れた時 NUM に Fizz が入って (($1 % 5 == 0)) && NUM=${NUM}Buzz ←5 で割り切れた時 NUM に Buzz が入る [ ! ${NUM} ] && NUM=$1 ← なんにもないときは数字が入る echo ${NUM}}for i in {1..100};do fizzbuzz ${i};done100 までループして fizzbuzz を呼んで表示させてる。NUM は文字列連結させてるので、3と5で割り切れたときは Fizz と Buzz のどちらの文字列も入る。
  10. 10. 算術式展開とリスト算術式展開を使うとexprを使わなくても計算できる。expr 1 + 1こういう風に書ける$((1 + 1))リストを使うと条件判定ができる。command1 && command2 command1の終了ステータスが0を返すとcommand2が実行される。command1 || command2 command1の終了ステータスが0以外を返すとcommand2が実行される。二つを応用するとif文の代わりにif (( $1 % 3 == 0 )); then NUM=${NUM}Fizz; fiこういう風に書ける(($1 % 3 == 0)) && NUM=${NUM}Fizz
  11. 11. プレース展開プレース展開を使うと任意の文字列が生成できる。$ echo {A..Z}ABCDEFGHIJKLMNOPQRSTUVWXYZ/usr/local/foo,bar,buzzの三つのディレクトリを作成する場合mkdir /usr/local/{foo,bar,buzz}とすると展開されて実行される。for文の中で使うとseqの代わりに使える。for i in {1..100};do fizzbuzz ${i};done
  12. 12. お題2.GPA(Grade Point Average)
  13. 13. おウスターソース #!/bin/bash N=$(head -n1 $1) S=$(tail -n1 $1) A=$(echo ${S}|tr -d [BCDF]) B=$(echo ${S}|tr -d [ACDF]) C=$(echo ${S}|tr -d [ABDF]) D=$(echo ${S}|tr -d [ABCF]) F=$(echo ${S}|tr -d [ABCD]) # echo $(((${#A}*4+${#B}*3+${#C}*2+${#D})/${N})) # sadly... echo "scale=5;(${#A}*4+${#B}*3+${#C}*2+${#D})/${N}" | bcファイルは2行しか無いことを前提にファイルの頭と最後を取り出す。 ABCDF の文字列から、それぞれの文字を切り出して文字数 x 点数 / 総文字数を bc に投げて平均を出している。
  14. 14. パラメータの展開通常$Aと書くところを${#A}と書くと$Aの文字数を返します。ABCDFが混ざった文字列から不要な文字BCDFを消してAだけにする。A=$(echo ${S}|tr -d [BCDF])変数$Aには「A」の文字列しか入ってないので通常はこうだけどecho $AAAAAAAAAAAAAAAAAパラメータ展開で${#A}と書くと文字列ではなく文字数を返すecho ${#A}16あとは普通に掛け算すればおk。
  15. 15. あれ?出力実行例2.79412bc に投げた例2.79411てことで、 man bc を見てみると…
  16. 16. 数bc における最も基本的な要素は 数 です。数は、整数部と小数部があり、任意の精度をとることができます。すべての数は、内部では 10 進数で表現されており、 計算も 10 進数で行われます。 ( 本バージョンでは、除算と乗算で結果に切捨てが 起こります。 )なんてこったい…
  17. 17. お題3.「tail -n 5」相当の動作を するプログラム
  18. 18. おトンカツソース#!/bin/bash # while version while_version(){parse_options(){ IFS=$n N=5 # default line number i=1 while getopts "n:" OPT; do while read LINE;do case ${OPT} in [ ${i} -gt ${START_LINE} ] && echo "${LINE}" n) N="$OPTARG" ;; let ++i esac done < ${FILENAME} done } shift $(($OPTIND-1)) FILENAME=$@ parse_options "$@"} END_LINE=$(wc -l ${FILENAME}|cut -f1 -d" ") START_LINE=$((${END_LINE} - ${N}))# sed versionsed_version(){ #sed_version if [ ${START_LINE} -gt 0 ]; then while_version sed "1,${START_LINE} d" ${FILENAME} else cat ${FILENAME} fi}parse_options で与えられたオプションをパース。そしてファイルの全体の行数と開始行を求めてそれぞれの関数に投げてます。
  19. 19. 最初に考えたバージョンtail -n 5 hoge.txt これは、おこられる…
  20. 20. 次に考えたバージョンsed 1,( 行数 -n) d hoge.txt bash やなくて sed やし…
  21. 21. がんばってみた i=1 while read LINE;do [ ${i} -gt ( 行数 -n) ] && echo "${LINE}" let ++i done < ${FILENAME}「 tac を使って逆順に読んで配列に放り込んで元の順で出力」という手も考えたけどあえてストレートに read で読んで出力しました。
  22. 22. 結果本家 tail$ time tail -n5 questions.mdreal 0m0.004suser 0m0.004ssys 0m0.000ssed バージョン$ time ./tail.sh -n 5 questions.mdreal 0m0.016suser 0m0.004ssys 0m0.000swhile バージョン$ time ./tail.sh -n 5 questions.mdreal 0m0.018suser 0m0.008ssys 0m0.004s
  23. 23. 本家使えあとBashはループさせたら負けあとBashはループさせたら負け
  24. 24. Bashのよいところ
  25. 25. Linuxなら大抵ある
  26. 26. zshさいこーという人もいるけど
  27. 27. いちいち切り替えるのめんどくさくないですか ? オプション補完はbash-completion使えば補完されるしプレース展開もできる からるしプレース展開もできるzsh使う意味なくね?
  28. 28. ちなみにヒストリー共有は.bashrc あたりにこんな風に書いておくとおk。引用元 : iandeth. - bash にて複数端末間でコマンド履歴 (history) を共有する方法 :http://iandeth.dyndns.org/mt/ian/archives/000651.htmlfunction share_history { history -a history -c history -r}PROMPT_COMMAND=share_historyshopt -u histappendexport HISTSIZE=9999
  29. 29. バグ
  30. 30. man bash
  31. 31. bash は大きすぎるし、遅すぎます。Its too big and too slow.
  32. 32. 知ってた
  33. 33. おあとがよろしいようで

×