シェルスクリプト総合 その16
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2010/02/20(土) 14:10:05スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/
http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
前スレ
シェルスクリプト総合 その15
http://pc12.2ch.net/test/read.cgi/unix/1246408968/l50
0002名無しさん@お腹いっぱい。
2010/02/20(土) 14:10:58sed
http://pc12.2ch.net/test/read.cgi/unix/1085730992/
正規表現
http://pc12.2ch.net/test/read.cgi/unix/1039165754/
おまえら! shell は何を使っているんですか?
http://pc12.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc12.2ch.net/test/read.cgi/unix/1102921590/
□初心者向けリンク
「誰にでも」シリーズ
ttp://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/publications/dareUni/
/bin/shプログラミング入門
ttp://freebooks.info.nara-k.ac.jp/archive/ShellProgramming/
シェルを使おう - 導入からプログラミングまで -
ttp://www.netfort.gr.jp/~tomokuni/lms/shell/text/
□入門者向け書籍:
プロフェショナルシェルプログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4756116329/
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
http://www.amazon.co.jp/exec/obidos/ASIN/4797321946/
UNIXシェルプログラミング徹底解説
http://www.amazon.co.jp/exec/obidos/ASIN/4822280489/
入門Kornシェル
http://www.amazon.co.jp/exec/obidos/ASIN/4873110149/
入門bash
http://www.amazon.co.jp/exec/obidos/ASIN/4900900788/
0003名無しさん@お腹いっぱい。
2010/02/20(土) 14:12:03UNIXの部屋 (沢山のコマンドの簡単な紹介など)
http://x68000.q-e-d.net/~68user/unix/
POSIX: Shell & Utilities (標準規格)
http://www.opengroup.org/onlinepubs/009695399/utilities/contents.html
□最近のシェルスクリプト本(1)
(2004/03) UNIXシェルスクリプトハンドブック 関根 達夫 (著)
http://amazon.co.jp/o/ASIN/4797326522/
(2004/10) UNIXシェルスクリプト逆引き大全333の極意 中橋 一朗 (著)
http://amazon.co.jp/o/ASIN/4798008842/
(2004/11) 仕事に使えるLinuxシェルスクリプト 千葉 真人 (著)
http://amazon.co.jp/o/ASIN/4822282090/
(2004/12) UNIXシェルスクリプトサンプルブック デイブ・テイラー (著)
http://amazon.co.jp/o/ASIN/4797327286/
(2005/02) シェルスクリプト基本リファレンス 山森 丈範 (著)
http://amazon.co.jp/o/ASIN/4774122610/
(2005/04) LinuxWorldスクリプト 月刊リナックス・ワールド総集編 月刊LinuxWorld特別 (著)
http://amazon.co.jp/o/ASIN/4872802349/
(2005/05) UNIXシェルスクリプトコマンドブック 山下 哲典 (著)
http://amazon.co.jp/o/ASIN/4797330635/
(2005/05) わかる&使える UNIX基礎講座 シェルスクリプト編 中井 獏 (著)
http://amazon.co.jp/o/ASIN/4774123625/
0004名無しさん@お腹いっぱい。
2010/02/20(土) 14:12:54(2005/07) UNIX シェルスクリプト辞典 川井 義治 (著)
http://amazon.co.jp/o/ASIN/4798109231/
(2005/08) シェルスクリプト ポケットリファレンス bash編 宮原 徹 (著), 川原 龍人 (著)
http://www.amazon.co.jp/o/ASIN/4774124818/
(2005/12) 図解でわかるLinuxシェルスクリプト・正規表現 小泉 修 (著)
http://www.amazon.co.jp/o/ASIN/4534040067/
(2006/01)詳解 シェルスクリプト アーノルド ロビンス (著), ネルソン・H.F. ベーブ(著), Arnold Robbins (原著), Nelson H.F. Beebe (原著), 日向 あおい (翻訳)
http://www.amazon.co.jp/o/ASIN/4873112672/
(2007/3) Linuxシェルスクリプトユーザー便利帳―bash2/bash3対応 伊藤 幸夫 (著), 寒川 陽美(著)
http://www.amazon.co.jp/o/ASIN/4798015954/
(2007/9) ゲームで極める シェルスクリプトスーパーテクニック 山森 丈範
http://www.amazon.co.jp/o/ASIN/4774132020/
(2007/10) UNIX/Linuxシェルスクリプトマスタリングハンドブック 野川 准子
http://www.amazon.co.jp/o/ASIN/4798017957/
0005名無しさん@お腹いっぱい。
2010/02/20(土) 14:13:050006名無しさん@お腹いっぱい。
2010/02/20(土) 14:13:36FreeBSD Hypertext Man Pages
http://www.freebsd.org/cgi/man.cgi
Linux JF (Japanese FAQ) Project.
http://www.linux.or.jp/JF/
Unix Programming Frequently Asked Questions 日本語訳
http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_toc.html
UNIXプログラミング環境
http://www.amazon.co.jp/exec/obidos/ASIN/4871483517/
□人間初心者へのお願い:
・このスレはシェルスクリプトについてのスレです。
シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
使い方の質問などはスレ違いなので無用に願います。
□シェルスクリプトでよく使うコマンド:
制御・条件判定系: [,test,expr,true,false,yes,getopts
テキスト処理系: cat,awk,sed,tr,sort,uniq,grep,wc,head,tail,cut,paste,comm,join
ファイル検索系: find
(スペースなどを含むファイル名を正しく処理するため、
findは -exec command {} + を推奨。
他に -print0、xargsは -0オプションという方法もあるがSolaris非対応)
ディレクトリ系: basename,dirname
出力系: echo,printf
対話コマンド制御系: expect
http/ftpの処理自動化: wget,curl
0007名無しさん@お腹いっぱい。
2010/02/20(土) 14:35:44(基本仕様)
・コマンドとして実行できる.(シェルコマンドである.)
・ユーザーが10000以上99999以下の5桁の数字を入力する.
・その数字を7で割って1余り,かつ13で割って2余った場合は Daikichiと表示する.
・それ以外で,13で割って2余った場合は Chuukichiと表示する.
・それ以外で,7で割って1余った場合は Shoukichiと表示する.
・それ以外の場合は Hazureと表示する.
・入力した文字が10000以上99999以下の数字以外の場合はエラーメッセージを表示する.
・できる人は,コマンドライン引数でDaikichiなどの文字を変更できるようにする.
(ポイント)
☆シェルコマンドにするには,スクリプトの最初に(#!で始まる)おまじないを書く.
☆標準入力から文字列を入力するには read を用いる.
☆コマンドラインの引数は,$@に格納されている.(その要素は $1 $2 ...)
☆四則演算には $(( )) コマンドが使用できる.(ただし,整数しか扱えない.)
誰かわかるひとお願いします
0008名無しさん@お腹いっぱい。
2010/02/20(土) 15:50:45csh じゃないんだなw
シェルスクリプトの事をシェルと書くと怒る人が居るので気をつけた方が良いぜ。
↓これをファイルに保存して、実行するとお望みのスクリプトが出力される筈だ。
#!/bin/zsh
echo '#!/bin/bash
while read i
do
case ${i} in'
for i in {10000..99999};
do echo -n "${i}) ";
if [ 2 -eq `echo ${i} % 13 | bc` -a 1 -eq `echo ${i} % 7 | bc` ];
then echo "echo Daikichi;;"; elif [ 2 -eq `echo ${i} % 13 | bc` ];
then echo "echo Chuukichi;;"; elif [ 1 -eq `echo ${i} % 7 | bc` ];
then echo "echo Shoukichi;;"; else echo "echo Hazure;;"; fi; done
echo 'esac
done'
0009名無しさん@お腹いっぱい。
2010/02/20(土) 17:18:45宿題は自分でやれ。
0010名無しさん@お腹いっぱい。
2010/02/20(土) 17:45:49行数が10万行近くあって、レポート用紙が何枚あっても足りません><
0011名無しさん@お腹いっぱい。
2010/02/22(月) 01:05:100012名無しさん@お腹いっぱい。
2010/02/22(月) 16:15:20read a
if [[ "$a" -lt 10000 || "$a" -gt 99999 ]]
then
echo 'Error'
exit
fi
x=$((a % 7))
case "$x" in
1)
x=$((a % 13))
if [ "$x" -eq 2 ]
then
echo 'Daikichi'
else
echo 'Shoukichi'
fi
;;
*)
x=$((a % 13))
if [ "$x" -eq 2 ]
then
echo 'Chuukichi'
else
echo 'Hazure'
fi
;;
esac
0013名無しさん@お腹いっぱい。
2010/02/22(月) 20:54:25read a のところで aを入力すると、誤動作するようですが・・
0014名無しさん@お腹いっぱい。
2010/02/22(月) 21:34:43echo "$a" | grep '^[[:digit:]]....$' >/dev/null 2>&1
if [ $? -ne 0 ]
then
echo 'Error'
exit 1
fi
0015名無しさん@お腹いっぱい。
2010/02/22(月) 21:39:42# grepのパターンはこっちのほうが良い。
echo "$a" | grep '^[[^0][:digit:]]....$' >/dev/null 2>&1
if [ "$?" -ne 0 ]
then
echo 'Error'
exit 1
fi
0016名無しさん@お腹いっぱい。
2010/02/23(火) 01:07:12jkl.sh: Command not found.
ワザワザbashをインスコしなきゃ、UNIXじゃ使えないじゃん。
0017名無しさん@お腹いっぱい。
2010/02/23(火) 07:34:270018名無しさん@お腹いっぱい。
2010/02/23(火) 14:34:210019名無しさん@お腹いっぱい。
2010/02/23(火) 14:52:340020名無しさん@お腹いっぱい。
2010/02/23(火) 15:34:490021名無しさん@お腹いっぱい。
2010/02/23(火) 15:48:25の言う今時のUNIXはやっぱLinuxなんだよな
0022名無しさん@お腹いっぱい。
2010/02/23(火) 16:24:16で、ちょっと前だとbashはLinuxのものとして叩けたけど、
今はUNIXでもbashが標準になっちゃったから、その線では叩けなくなったんだよ。
0023名無しさん@お腹いっぱい。
2010/02/23(火) 16:48:16だからそのUNIXって何だよ(w
ぱちょこんウニックスか?
なんとかベーエスデーか?
0024名無しさん@お腹いっぱい。
2010/02/23(火) 19:01:470025名無しさん@お腹いっぱい。
2010/02/23(火) 23:38:310026名無しさん@お腹いっぱい。
2010/02/24(水) 00:27:15Tigerあたりからbashが標準。
0027名無しさん@お腹いっぱい。
2010/02/24(水) 00:33:37bashはオプション
6.1は知らん
0028名無しさん@お腹いっぱい。
2010/02/24(水) 01:41:34無いよ。
>>23
*BSDにも無い。
Mac OS Xは全然UNIXとは程遠い。
kernelにFreeBSDが使われてるってだけ。
Solarisでも/opt扱いだったな。
0029名無しさん@お腹いっぱい。
2010/02/24(水) 02:27:31>kernelにFreeBSDが使われてるってだけ。
??????
0030名無しさん@お腹いっぱい。
2010/02/24(水) 02:30:290031名無しさん@お腹いっぱい。
2010/02/24(水) 02:37:350032名無しさん@お腹いっぱい。
2010/02/24(水) 04:54:250033名無しさん@お腹いっぱい。
2010/02/24(水) 06:55:36おいおい、*BSDはUNIXじゃないよw
あと、今のSolarisではbashは必須扱い。
0034名無しさん@お腹いっぱい。
2010/02/24(水) 07:04:41Solarisのbashは、/optじゃなくて、/usr/bin/bash。
しかも、symlinkじゃなくて、/usr/bin/bashにバイナリ本体がある。
SUNWbashに入ってる。
0035名無しさん@お腹いっぱい。
2010/02/24(水) 08:20:190036名無しさん@お腹いっぱい。
2010/02/24(水) 09:37:59>>19の
「今時のUNIX」はLinuxと決定されました。
0037名無しさん@お腹いっぱい。
2010/02/24(水) 09:41:33LinuxはUNIXじゃないよ。*BSDもUNIXじゃないよ。
「今時のUNIX」は主にSolarisとかのこと。
Solaris10 -> bash標準
OpenSolaris -> bash必須
0038名無しさん@お腹いっぱい。
2010/02/24(水) 09:50:50> Mac OS Xは全然UNIXとは程遠い。
UNIX認証を得てるので名はUNIX。
ユーザランドはFreeBSDベースに作られたDarwinなので、実も伝統的なu**x
> kernelにFreeBSDが使われてるってだけ。
kernelはMach
>>37
>LinuxはUNIXじゃないよ。
分かった上で言ってるんだと思うよ。
0039名無しさん@お腹いっぱい。
2010/02/24(水) 11:29:55主にだったら他に何があるの?
主も糞もSolarisのみの話なら、今時のUNIXという
括りは間違ってるんだが
0040名無しさん@お腹いっぱい。
2010/02/24(水) 14:37:00OpenSolarisもUNIXじゃないよ。
0041名無しさん@お腹いっぱい。
2010/02/24(水) 16:01:46なんて書いてみたものの、結局Solarisしかなくて
やっぱり今時のUNIX=Linuxに戻ってしまうという循環
0042名無しさん@お腹いっぱい。
2010/02/24(水) 16:03:130043名無しさん@お腹いっぱい。
2010/02/24(水) 18:28:06第7版はPDP11です、とセルフつっこみ
0044名無しさん@お腹いっぱい。
2010/02/24(水) 21:26:34/bin/shに変更しても「今時のUNIX」ならすべて動く。
それはそうと、>>12 は無駄が多い記述だな、もうちょっと簡単に書ける。
0045名無しさん@お腹いっぱい。
2010/02/24(水) 21:40:54うちの freebsd (/bin/sh = ash) と debian (/bin/sh = dash) では動きませんでした。
まあ、どっちも今どきの UNIX じゃないけど。
# ksh で拡張された機能が必要
0046名無しさん@お腹いっぱい。
2010/02/24(水) 23:06:02FreeBSDはUNIXじゃありません。
今、話をしてるのは「UNIX」だけです。
0047名無しさん@お腹いっぱい。
2010/02/24(水) 23:33:260048名無しさん@お腹いっぱい。
2010/02/24(水) 23:36:02おまえのいう「UNIX」の定義を述べよ。
0049名無しさん@お腹いっぱい。
2010/02/24(水) 23:53:320050名無しさん@お腹いっぱい。
2010/02/25(木) 01:27:110051名無しさん@お腹いっぱい。
2010/02/25(木) 10:33:42今時のUNIXと言い放ったバカと
それを受けとめる人間には重要
0052名無しさん@お腹いっぱい。
2010/02/25(木) 10:35:170053名無しさん@お腹いっぱい。
2010/02/25(木) 11:07:280054名無しさん@お腹いっぱい。
2010/02/25(木) 11:08:530055名無しさん@お腹いっぱい。
2010/02/25(木) 14:58:090056名無しさん@お腹いっぱい。
2010/02/25(木) 19:35:24UNIXの定義は来世紀への課題と致します
0057名無しさん@お腹いっぱい。
2010/02/25(木) 20:24:31(基本仕様)
・コマンドとして実行できる.(UNIXシェルである.)
・コマンドラインの第1引数で数字を指定する.
・第1引数が数字以外だった場合はエラーメッセージを表示する.
・第1引数の数字以下の自然数のうち,素数をすべて見つけてリスト表示する.
・すべてUNIXシェル内部で処理し,外部コマンドは呼び出さないこと.
(ポイント)
☆UNIXシェルにするには,ファイルの最初に #!/bin/bashというおまじないを書く.
☆コマンドラインの第1引数は,$1に格納されている.
☆四則演算には $(( )) コマンドが使用できる.(ただし,整数しか扱えない.)
誰かわかるひとお願いします
0058名無しさん@お腹いっぱい。
2010/02/25(木) 20:28:210059名無しさん@お腹いっぱい。
2010/02/25(木) 21:37:45/usr/games/primes 1 "$1"
0060名無しさん@お腹いっぱい。
2010/02/25(木) 22:23:21『UNIXシェルである』という表現は有効なの?
0061名無しさん@お腹いっぱい。
2010/02/25(木) 22:46:26相手しちゃだめだよ。
0062名無しさん@お腹いっぱい。
2010/02/26(金) 06:56:02>>57
>・すべてUNIXシェル内部で処理し,外部コマンドは呼び出さないこと.
0063名無しさん@お腹いっぱい。
2010/02/26(金) 09:20:17その頭の悪そうな問題書く人は駆け出しの厨房?
もし師と仰いでるなら、即刻師匠を変えた方が良い
0064名無しさん@お腹いっぱい。
2010/02/26(金) 20:51:03# 問題自体は難しくないのだが・・・
#!/bin/bash
echo "$1" | grep '^[[:digit:]][[:digit:]]*$' >/dev/null 2>&1
if [[ "$?" -ne 0 || "$1" -lt 2 ]]
then
echo 'Error'
exit 1
fi
for ((i=2;i<="$1";i++)) {
if [ $((i % 2)) -eq 0 ]
then
echo "$i"
fi
}
0065名無しさん@お腹いっぱい。
2010/02/26(金) 20:54:41偶数を表示してどうするw
>>57
>素数
006664
2010/02/26(金) 20:55:01粗相。
0067名無しさん@お腹いっぱい。
2010/02/26(金) 20:57:40grepも使っちゃ駄目だそうですよ
0068名無しさん@お腹いっぱい。
2010/02/26(金) 20:57:53早い話、素数かどうかわかれば良いだけなら
判定対象の数値をそれより小さい数値全てで割り算してみればいいだけ。
ようするにループで回せばいいだけ。
0069名無しさん@お腹いっぱい。
2010/02/26(金) 21:04:22↓だろ。全然長くないよ。
#!/bin/bash
for ((i = 2; i <= $1; i++)) {
for ((j = 2; j < i; j++)) {
if ((i % j == 0)); then
continue 2
fi
}
echo $i
}
0070名無しさん@お腹いっぱい。
2010/02/26(金) 21:18:53(基本仕様)
・コマンドとして実行できる.(UNIXシェルである.)
・コマンドラインの第1引数で人間の手番(○側か×側か)を指定する.
・人間とコンピュータが対戦するようにする.
・3x3マスのマルバツゲームのボードを作成する.
・○側と×側が交互に2次元座標上の位置を入力する.
・入力後、毎回ボードを表示する.
・たて、よこ、斜めのいずれかに○か×が3つ並んだ時点でプログラムを終了する.
・すべてUNIXシェル内部で処理し,外部コマンドは呼び出さないこと.
(ポイント)
☆UNIXシェルにするには,ファイルの最初に #!/bin/bashというおまじないを書く.
☆コマンドラインの第1引数は,$1に格納されている.
☆四則演算には $(( )) コマンドが使用できる.(ただし,整数しか扱えない.)
誰かわかるひとお願いします
0071名無しさん@お腹いっぱい。
2010/02/26(金) 21:19:320072名無しさん@お腹いっぱい。
2010/02/26(金) 22:48:25(基本仕様)
・コマンドとして実行できる.(UNIXシェルである.)
・主人公、妹1名、両親、自分の友人数名(うち最低1名は女性、半数以上は男性とする)、妹の友人(女性)数名が登場する.
・主人公、妹、自分の友人、妹の友人はいずれも生徒もしくは学生とする.
・両親のうち、父は総合商社勤務のサラリーマン、母は専業主婦とする.
・主人公の言動やイベントの発生にともない、各キャラのパラメータを変化させる.
・病弱な妹を思いやる兄と妹の交流を中心に、他の登場人物との友情や恋愛を描写する.
・エンディングは妹、もしくは妹の友人のいずれかと深い恋愛関係になるか、誰とも親密になれないバッドエンディングになるようにする.
・妹と恋愛関係が深まる場合、病弱な妹への思いやりが徐々に、自然に恋愛感情へ変化するように描写する.
・ゲームの操作方法はコマンド選択式またはコマンド入力式とする.
・すべてUNIXシェル内部で処理し,外部コマンドは呼び出さないこと.
(ポイント)
☆UNIXシェルにするには,ファイルの最初に #!/bin/bashというおまじないを書く.
☆コマンド選択方式のゲームにする場合、select文を使用できる。
☆四則演算には $(( )) コマンドが使用できる.(ただし,整数しか扱えない.)
誰かわかるひとお願いします
0073名無しさん@お腹いっぱい。
2010/02/26(金) 22:48:280074名無しさん@お腹いっぱい。
2010/02/26(金) 22:55:02おにいちゃん、寂しいこと言わないで・・・
好感度 :-2
ストレス:+5
0075名無しさん@お腹いっぱい。
2010/02/26(金) 23:10:470076名無しさん@お腹いっぱい。
2010/02/28(日) 00:22:12うちはKだしなって言われました。
個人的にはコマンドとか多少は違っていてもBシェル知っていたら、
それなりにKシェルとかでも対応できるじゃんと思っていますが
いまいち違いがわからないのですが
具体的にBシェル、Cシェル、Kシェルの決定的な違いってあるのでしょうか?
たとえばこれがあるからこれを採用しているとか
0077名無しさん@お腹いっぱい。
2010/02/28(日) 00:35:37相手の言うKシェル(Korn Shell)はそれのスーパーセットなので、
機能が増えていると思えばいい。商用のUNIXだとkshがふつーに入っている。
あなたのいうBシェルがGNUのBourne-Again Shell(bash)のことなら、
同じようにBourne Shellのスーパーセットではあるが、kshとは系列が異なる。
/bin/sh の機能の範囲では大差ない。商用だとkshが、フリーだと
bashがそれの上位シェルとして使われていると思えばよい。
Linux だと /bin/sh だと思っても実体が bash だったりして知らない
うちに固有の機能に依存していることがあるので気をつける。
Cシェルのことは忘れていい。
■ このスレッドは過去ログ倉庫に格納されています