シェルスクリプト総合 その5
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2006/01/21(土) 09:00:29スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合はbourne shがデフォルトです。
bash/csh/tcsh/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
0539名無しさん@お腹いっぱい。
2006/03/11(土) 23:53:010540名無しさん@お腹いっぱい。
2006/03/12(日) 00:05:30間違いなくかかってくる。
0541名無しさん@お腹いっぱい。
2006/03/12(日) 00:13:26「そのアドレスは私が使っているものですから公表しないでください」という
怖いメールが来ることも…
0542名無しさん@お腹いっぱい。
2006/03/12(日) 00:31:20「どうして RFC に書いてあるとおりにしないんですかっ!?!?!!!111!!」
というお怒りのメールが来ることもあるのだろうな。
0543名無しさん@お腹いっぱい。
2006/03/12(日) 00:44:040544名無しさん@お腹いっぱい。
2006/03/12(日) 01:08:35( ´∀`)< オマエモナー
( ) \_____
| | |
(__)_)
0545名無しさん@お腹いっぱい。
2006/03/12(日) 02:42:170546名無しさん@お腹いっぱい。
2006/03/12(日) 02:57:49懐かしいネタだな。
0547名無しさん@お腹いっぱい。
2006/03/12(日) 03:32:48個人のメモ書き程度なら何も言わんが、人の目に触れる様な所で使うのは止めとけ。
0548名無しさん@お腹いっぱい。
2006/03/12(日) 08:46:56※注 例として256以上のオクテットを含むIPアドレスを表示しています。
と、同じページに注釈を入れておけば無問題。
>>542
RFCでは192で始まるアドレスなので紛らわしい。
RFC云々を言うものはかなりの上級者なので、
こういう事でいちいち電話しない。
0549名無しさん@お腹いっぱい。
2006/03/12(日) 09:43:00RFCの192.0.2.xxx だけじゃ表現できず、困りますな。
まさか192.0.2.xxxをさらにネットマスクで分けたりしても
例示としてさらに紛らわしくなるだけ。
0550名無しさん@お腹いっぱい。
2006/03/12(日) 10:09:42RFC 書いたら?
0551名無しさん@お腹いっぱい。
2006/03/12(日) 10:36:300552名無しさん@お腹いっぱい。
2006/03/12(日) 11:20:320553名無しさん@お腹いっぱい。
2006/03/12(日) 12:28:35好き勝手にやればいいんだよ。シェア取ったもん勝ちなんだから。
RFCを神みたく崇め奉ってる奴ってバカ。
0554名無しさん@お腹いっぱい。
2006/03/12(日) 12:28:54RFC書く労力使うくらいなら、語呂のいい数字の組合せで商標登録しますw
0555名無しさん@お腹いっぱい。
2006/03/12(日) 12:41:54あれはRFCに沿ってるの?
0556名無しさん@お腹いっぱい。
2006/03/12(日) 12:45:22晒しage
0557名無しさん@お腹いっぱい。
2006/03/12(日) 14:08:17「256以上のオクテット」がそもそも矛盾してないか?
符号無し整数なら 255 までなのに。
0558名無しさん@お腹いっぱい。
2006/03/12(日) 14:33:210559名無しさん@お腹いっぱい。
2006/03/12(日) 18:17:59あり得ないアドレスを例に使うために、どこかを矛盾させなければならないのは当然。
敢えて矛盾させています、という注釈だろ。だからそれはおかしくない。
0560名無しさん@お腹いっぱい。
2006/03/12(日) 18:24:030561名無しさん@お腹いっぱい。
2006/03/12(日) 18:48:58太郎さんのアドレス「富.士.見.町」を指定する必要があります。
0562名無しさん@お腹いっぱい。
2006/03/12(日) 19:40:160563名無しさん@お腹いっぱい。
2006/03/12(日) 20:04:330564名無しさん@お腹いっぱい。
2006/03/12(日) 20:08:01ホストA ホストB
| 富.士.見.町 | 御.殿.場.市
−+−−−−−−−+−−
図1 ネットワーク構成の例
0565名無しさん@お腹いっぱい。
2006/03/12(日) 20:52:490566名無しさん@お腹いっぱい。
2006/03/12(日) 20:58:520567名無しさん@お腹いっぱい。
2006/03/12(日) 21:00:00copy[Enter]とタイプすると、「コピー元ファイル>」と聞いてきて、
ファイル名を入力すると、「コピー先ファイル>」と聞いてきて、
ファイル名を入力するとコピーされます。
「コピー先ファイル>」のところで、ディレクトリ名を入力した場合は、
そのディレクトリの内容が表示されて、再び「コピー先ファイル>」と聞いてきて、
ファイル名を入れると、そのディレクトリにコピーされます。
その他、コピー元ファイルが見つからない場合はエラーメッセージを出して
再び「コピー元ファイル>」と聞きます。
時間がありませんが、明日月曜の朝までにお願いします。
0568名無しさん@お腹いっぱい。
2006/03/12(日) 21:02:31何だいそりゃあ。
0569名無しさん@お腹いっぱい。
2006/03/12(日) 21:11:34実装言語は C? それとも Perl とか Python とか使って良いの?
0570名無しさん@お腹いっぱい。
2006/03/12(日) 21:21:10#!/bin/sh
infile="$1"
tofile="$2"
[ -z "$infile" ] && echo -n "コピー元のファイル>" && read infile
[ -z "$tofile" ] && echo -n "コピー先のファイル>" && read tofile
[ -d "$tofile" ] && (ls "$tofile"; "$0" "$infile") || cp "$infile" "$tofile"
0571名無しさん@お腹いっぱい。
2006/03/12(日) 21:32:56それだと、ディレクトリが一旦指定された場合に、そのディレクトリの情報が
サブシェルに渡らないのでは? あと、延々ディレクトリを入力すると
プロセスが増え続ける。
つーか、>>567 に対する答えはひとつ「宿題禁止!!」
0572名無しさん@お腹いっぱい。
2006/03/12(日) 22:15:47更には「コンデンサには寿命がある」とか言い出す香具師まで居る始末。
そもそも「電解」コンデンサだけが寿命があって特殊なんだよ。
一般的なセラミックやポリカーボネイトには寿命がなく、半永久で使える。
0573名無しさん@お腹いっぱい。
2006/03/12(日) 22:29:200574名無しさん@お腹いっぱい。
2006/03/12(日) 23:02:01#!/bin/sh
infile="$1"
tofile="$2"
[ -z "$infile" ] && echo -n "コピー元のファイル>" && read infile
[ -z "$tofile" ] && echo -n "コピー先のファイル>" && read tofile
tofile="$WD$tofile"
[ -d "$tofile" ] && (ls "$tofile"; WD="$tofile/" "$0" "$infile") || cp "$infile" "$tofile"
宿題って言うより頭の体操かな?
無視したければ、あぼーんしといてよ。
0575名無しさん@お腹いっぱい。
2006/03/12(日) 23:29:540576名無しさん@お腹いっぱい。
2006/03/12(日) 23:39:280577名無しさん@お腹いっぱい。
2006/03/12(日) 23:57:49こんな感じで。
富.士.見.0/24でクラスCだから、
ホストA: 富.士.見.町
ホストB: 富.士.見.台
0579名無しさん@お腹いっぱい。
2006/03/13(月) 02:36:02WD設定する前に使ってるところとか、再度ファイル名を聞く処理が抜けてたりして
いい加減だなとは思う。まあ、対話的にファイル名入力させるコマンドなんか
死んでも使わないからどうでもいいけどさあ。
0580名無しさん@お腹いっぱい。
2006/03/13(月) 03:53:31cp、read、test、echo あたりを使えば出来る。
後は man を見て頑張れ。
0581名無しさん@お腹いっぱい。
2006/03/13(月) 08:15:120582名無しさん@お腹いっぱい。
2006/03/13(月) 08:52:56コピー元ファイルが存在しなかった時に聞き直す処理が実装されていないようだが・・
0583名無しさん@お腹いっぱい。
2006/03/13(月) 09:14:14再帰実行した自分が失敗して帰った来た時に、cp強行が汚いどす。
$ true && true || echo done
$ true && false || echo done
done
0584名無しさん@お腹いっぱい。
2006/03/13(月) 09:15:30さらに、自分をexecするんじゃなく、
whileループの中で、再入力ならcontinueするようにすれば
execする必要もなくなる。
と、ヒントだけ書いておこう。
0585名無しさん@お腹いっぱい。
2006/03/13(月) 09:19:09再帰を使う処理が真っ先に思い浮かぶ人間はLisp出身だと思う。
0586名無しさん@お腹いっぱい。
2006/03/13(月) 12:54:270587名無しさん@お腹いっぱい。
2006/03/13(月) 14:21:16言ってみろ
0588名無しさん@お腹いっぱい。
2006/03/13(月) 15:00:15「真のプログラマはgotoを恐れない」
0589名無しさん@お腹いっぱい。
2006/03/13(月) 15:54:220590名無しさん@お腹いっぱい。
2006/03/13(月) 15:56:490591名無しさん@お腹いっぱい。
2006/03/13(月) 16:12:04というか、/bin/shにgotoはないし、break 2以上ができるので
gotoは根本的に排除されている。
まあ、gotoがあるcshみたいなアフォなシェルもあるが・・
0592名無しさん@お腹いっぱい。
2006/03/13(月) 16:22:00後藤っていう理科の先生が
フィリピンかどっかで自己紹介したら笑われたって
現地の言葉で「後藤=焼きうどん」なんだそうな
0593名無しさん@お腹いっぱい。
2006/03/13(月) 16:52:090594名無しさん@お腹いっぱい。
2006/03/13(月) 17:07:560595名無しさん@お腹いっぱい。
2006/03/13(月) 17:32:19Knuth先生に失礼なヤツだな
0596名無しさん@お腹いっぱい。
2006/03/13(月) 17:34:440597名無しさん@お腹いっぱい。
2006/03/13(月) 20:00:43ヘボを見分ける指標になる。
0598名無しさん@お腹いっぱい。
2006/03/13(月) 21:16:58hoge2/hoge5.ooo
hoge3/hoge6.ooo
これを全て
hoge1/hoge4.ppp_ooo
hoge2/hoge5.ppp_ooo
hoge3/hoge6.ppp_ooo
に変えたいんですが、どうすればいいかわけわかめです。
help me orz
0599名無しさん@お腹いっぱい。
2006/03/13(月) 21:18:38mv hoge1/hoge4.ooo hoge1/hoge4.ppp_ooo
mv hoge2/hoge5.ooo hoge2/hoge5.ppp_ooo
mv hoge3/hoge6.ooo hoge3/hoge6.ppp_ooo
0600名無しさん@お腹いっぱい。
2006/03/13(月) 21:22:27for file in hoge*/hoge*.ooo
do
mv $file `echo $file | sed 's/ooo/ppp_ooo/'`
done
>>599
アフォか。
0601名無しさん@お腹いっぱい。
2006/03/13(月) 21:29:060602名無しさん@お腹いっぱい。
2006/03/13(月) 21:32:070603名無しさん@お腹いっぱい。
2006/03/13(月) 21:43:160604名無しさん@お腹いっぱい。
2006/03/13(月) 21:47:140605名無しさん@お腹いっぱい。
2006/03/13(月) 21:47:200606名無しさん@お腹いっぱい。
2006/03/13(月) 21:49:590607名無しさん@お腹いっぱい。
2006/03/13(月) 21:52:220608名無しさん@お腹いっぱい。
2006/03/13(月) 22:01:240609名無しさん@お腹いっぱい。
2006/03/13(月) 22:02:350610名無しさん@お腹いっぱい。
2006/03/13(月) 22:11:030611名無しさん@お腹いっぱい。
2006/03/13(月) 22:12:360612名無しさん@お腹いっぱい。
2006/03/13(月) 22:13:42>mmm
アスキーネットにみたいなホストプログラム?
0613名無しさん@お腹いっぱい。
2006/03/13(月) 23:22:450614名無しさん@お腹いっぱい。
2006/03/13(月) 23:34:03スクリプトの最初で、引数で指定された全ファイルが存在することをチェックし、
そのあと各々処理したいんです。
0615名無しさん@お腹いっぱい。
2006/03/13(月) 23:45:04存在チェック関数書いて呼べ
0616名無しさん@お腹いっぱい。
2006/03/14(火) 00:05:48あったら便利だと思うのに
ありがとうございました。
0617名無しさん@お腹いっぱい。
2006/03/14(火) 00:17:49shift の反対は無いが
>スクリプトの最初で、引数で指定された全ファイルが存在することをチェック
が目的なら shift 使わなくてもどうにかなるよ。
for i in "$@"
do
[ -e "$i" ] || exit
done
0618名無しさん@お腹いっぱい。
2006/03/14(火) 00:30:040619614
2006/03/14(火) 00:35:48そうかfor文かfunction使えばいいのか・・・
ありがとうございます。
0620名無しさん@お腹いっぱい。
2006/03/14(火) 07:34:29どこのrename ? そんなの本当にあるの?
0621名無しさん@お腹いっぱい。
2006/03/14(火) 07:37:170622名無しさん@お腹いっぱい。
2006/03/14(火) 08:49:45perlについてくるぞ。
0623名無しさん@お腹いっぱい。
2006/03/14(火) 08:57:46http://search.cpan.org/~rmbarker/File-Rename-0.02/lib/File/Rename.pm
0624名無しさん@お腹いっぱい。
2006/03/14(火) 09:05:150625名無しさん@お腹いっぱい。
2006/03/14(火) 11:59:17あると便利なんだが
0626名無しさん@お腹いっぱい。
2006/03/14(火) 12:12:45http://www.gnome.org/projects/gb/
は終わったか。
http://www.mono-project.com/VisualBasic.NET_support
とか?
0627名無しさん@お腹いっぱい。
2006/03/14(火) 12:49:29Linuxだと標準で /usr/bin/renameがある。
renameといえば普通これを指す。ちゃんとしたバイナリだし、
perlは無関係だよ。
0628名無しさん@お腹いっぱい。
2006/03/14(火) 13:01:34rename jpeg jpg *.jpeg
となるようだ。
全く別物の同名コマンドが出回っているようなので、
シェルスクリプトでは使えんな。
(もともと使ってなかったけど)
0629名無しさん@お腹いっぱい。
2006/03/14(火) 13:12:49一口に Linux って言ってもその辺はディストリによって違うだろ。
Debian の /usr/bin/rename は perl スクリプトだよ。
たぶん >>623 の古い版。
0630名無しさん@お腹いっぱい。
2006/03/14(火) 13:17:14「util-linux の rename」だろうな。
0631名無しさん@お腹いっぱい。
2006/03/14(火) 13:22:37perlではない。RH系とSlackware系が同じだから、他でも同じかと思ったら
Debianでは違うのか。
まあ、そもそもrenameなんて使わないし、どうでもいいけどね。
人に説明する時はどのrenameか断らないと誤解を受けるね。
0632名無しさん@お腹いっぱい。
2006/03/14(火) 14:03:01俺の環境だとperlパケージの/usr/bin/prenameへのシンボリックリンク
$ update-alternatives --display rename
rename - status is auto.
link currently points to /usr/bin/prename
/usr/bin/prename - priority 60
slave rename.1.gz: /usr/share/man/man1/prename.1.gz
Current `best' version is /usr/bin/prename.
要するにDebianの場合サイトごとに違う。
# ここんところがシェルスクリプトスレにちょいと関係あるのでレスしてみた。
といってもrenameの候補があるperl以外のパケージ見たことないが…
0633名無しさん@お腹いっぱい。
2006/03/14(火) 15:00:24そういうのあるの知らなかった。
0634名無しさん@お腹いっぱい。
2006/03/14(火) 17:20:250635名無しさん@お腹いっぱい。
2006/03/14(火) 21:03:04俺的には珠玉のperlスクリプト。
0636名無しさん@お腹いっぱい。
2006/03/14(火) 22:36:00$cat L1
aaa
bbb
ccc
1
ddd
eee
2
これを
$cat L1
aaa bbb ccc 1
ddd eee 2
に変換する方法教えてくれ〜
0637名無しさん@お腹いっぱい。
2006/03/14(火) 22:48:16if expr "$x" : '[0-9][0-9]*$' > /dev/null; then
echo "$x"
else
echo -n "$x "
fi
done
0638名無しさん@お腹いっぱい。
2006/03/14(火) 22:50:20変換後が2行になるための条件は?
数字が来たらってこと?
■ このスレッドは過去ログ倉庫に格納されています