シェルスクリプト総合 その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 でトレースしましょう。
0454名無しさん@お腹いっぱい。
2006/03/07(火) 16:12:32$ cat << _EOF_ | sort -u
> @aaa.com
> @hoge.net
> @foo.bar
> @aaa.com
> @foo.bar
> _EOF_
@aaa.com
@foo.bar
@hoge.net
0455名無しさん@お腹いっぱい。
2006/03/07(火) 16:38:26awk '{if (!seen[$0]++) print}'
とかな。
0456名無しさん@お腹いっぱい。
2006/03/07(火) 22:36:41cat -n | sort -k 2 -u | sort -n | cut -f 2-
0457名無しさん@お腹いっぱい。
2006/03/07(火) 23:44:450458名無しさん@お腹いっぱい。
2006/03/07(火) 23:54:310459名無しさん@お腹いっぱい。
2006/03/07(火) 23:59:450460名無しさん@お腹いっぱい。
2006/03/08(水) 08:15:14そのアイデアはいいな。
前に同じような作業したときは、
perl で一度出てきた行を記憶しておくという
非常に馬鹿正直なやり方をしてた。
0461名無しさん@お腹いっぱい。
2006/03/08(水) 08:40:080462名無しさん@お腹いっぱい。
2006/03/08(水) 11:04:570463名無しさん@お腹いっぱい。
2006/03/08(水) 11:12:40>>455と>>460の方がメモリに抱える行は少ないわけだが…
0464名無しさん@お腹いっぱい。
2006/03/08(水) 11:13:440465名無しさん@お腹いっぱい。
2006/03/08(水) 11:16:55メモリとか気にするなら
シェルスクリプト使わないよ。
多少実行時のパフォーマンス悪くても
さくっと作れる方重視でいいじゃん。
0466名無しさん@お腹いっぱい。
2006/03/08(水) 12:24:040467名無しさん@お腹いっぱい。
2006/03/08(水) 12:25:350468名無しさん@お腹いっぱい。
2006/03/08(水) 12:27:310469名無しさん@お腹いっぱい。
2006/03/09(木) 00:56:08効率なんか気にするな。
0470名無しさん@お腹いっぱい。
2006/03/09(木) 01:02:26perl のモジュールのインストールをはじめるのであった。
0471名無しさん@お腹いっぱい。
2006/03/09(木) 01:18:58perlのモジュールならWinでもつかえるな、、、とか言ってミルク
0472名無しさん@お腹いっぱい。
2006/03/09(木) 01:35:23ボケ老人乙。
その5行で書けて、perlにモジュールが存在する具体例を
挙げてみようね。
口から出まかせはやめよう。お前のようなやつの年金を払っているかと
思うと反吐が出そうになる。
0473名無しさん@お腹いっぱい。
2006/03/09(木) 01:45:300474名無しさん@お腹いっぱい。
2006/03/09(木) 02:09:18while read url;do
if [ -z "$referer" ]; then referer="$(dirname $url)/index.html"; fi
test -f $(basename $url) || (while ! wget --user-agent='Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Win 9x 4.90; T312461)' --referer="$referer" --header='Accept-Encoding: gzip, deflate' --header='Accept-Language: en-us' "$1"; do sleep 1; done)
done
perlのモジュールというとLWPか。生活保護費もよろしくな。
0475名無しさん@お腹いっぱい。
2006/03/09(木) 02:56:35ダブルコーテーション使ったりシングルコーテション使ったりいろいろみたいなのですが、
どちらが正しいとかはありますか?
0476名無しさん@お腹いっぱい。
2006/03/09(木) 03:04:450477名無しさん@お腹いっぱい。
2006/03/09(木) 03:05:17シングルとダブルでは展開される要素の種類が全然違う。
正しいとかじゃなくて用途で使い分けるもの。
0478名無しさん@お腹いっぱい。
2006/03/09(木) 07:26:44あえて「どちらが正しい」というなら、
シングルクォートが正しい。
検索文字列などの中で、シェル変数の展開等が必要ないのに
ダブルクォートで囲ってあるのはバグの誘発になるのでやめた方がいい。
シングルクォートで囲っておけば、
シングルクォート自身以外はすべてシェルの解釈を避けられる。
0479名無しさん@お腹いっぱい。
2006/03/09(木) 08:38:11その手の話は専用スレがあるよ。
連番のH画像/動画を一気にダウンロードする2
http://pc8.2ch.net/test/read.cgi/unix/1135533382/
0480名無しさん@お腹いっぱい。
2006/03/09(木) 09:41:23おいおいwgetなんて使うなよ。無理してシェルスクリプト使って破綻してる例だな。
perl使った方がほぼ全ての点で優ってる。
0481名無しさん@お腹いっぱい。
2006/03/09(木) 18:17:37ちょっと添削。
「while ! コマンド」
という書き方は bashを含む一部のシェルでしか使えない。
「until コマンド」
と書いた方がいい。
あ、
$(basename $url)
も突っ込みたいが、またの機会に・・
>>480
shellで書いた方が頭がいい。>>474 は別に破綻していない。
何でもperlで書くのは良くない。
0482名無しさん@お腹いっぱい。
2006/03/09(木) 18:20:02なんで perl で書いちゃいかんの?
0483名無しさん@お腹いっぱい。
2006/03/09(木) 19:44:28【設問1】
>>481 が、なぜperlで書くと良くないと言っているか、
本文中の言葉を使って書き出せ。(5点)
0484名無しさん@お腹いっぱい。
2006/03/09(木) 19:48:54DNSルックアップとconnectを行ってしまうのはあまりよろしくないかも
知れない。
0485名無しさん@お腹いっぱい。
2006/03/09(木) 20:05:08DNSはcacheしてるから無問題。
0486名無しさん@お腹いっぱい。
2006/03/09(木) 22:52:59-------スクリプトA--------------
#!/bin/sh
echo 'NAME=$HOST' | egrep 'NAME=\$HOST'
-------ここまで--------------
↑のスクリプトを実行すると
NAME=$HOST
と表示されます。(期待する結果)
-------スクリプトB--------------
#!/bin/sh
aaa=`echo 'NAME=$HOST' | egrep 'NAME=\$HOST'`
echo $aaa
-------ここまで--------------
↑のように、変数に入れて、echoで出力すると、空行が1行表示されるだけなのです。
本当はスクリプトAのように出力させたいのです。
どうすればよいのか、よろしくご教授お願いします。
0487名無しさん@お腹いっぱい。
2006/03/09(木) 22:57:19` ` で囲まれた中の \ は要注意。
$ aaa=`echo 'NAME=$HOST' | egrep 'NAME=\\$HOST'`
$ echo "$aaa"
NAME=$HOST
期待される結果。
0488名無しさん@お腹いっぱい。
2006/03/09(木) 23:06:04紙さま!!
ありがとうございます!!!
0489名無しさん@お腹いっぱい。
2006/03/09(木) 23:10:07#! /bin/sh -x
を推奨。
0490名無しさん@お腹いっぱい。
2006/03/10(金) 06:04:26外部ファイルに
IP=111.222.333.444
と書いたファイルがあります。
これを読み込んで
#!/bin/sh
cat << EOF > /home/test.txt
ip='${IP}'
EOF
を実行すると、test.txtに
ip='111.222.333.444^M'
と、「^M」と言う文字が入ってしまいます。
「111.222.333.444」だけを書き込むにはどうしたらいいでしょうか?
よろしくお願いします。
0491名無しさん@お腹いっぱい。
2006/03/10(金) 07:29:08そもそも、外部ファイルの IP=111.222.333.444 に、
もともと ^M が付いているのが原因なので、
UNIXファイルとしてエディットして ^M を付けないのが正しい解決法だが、
どうしてもシェル側で ^M を取りたいなら、
外部ファイルを . で読んだ後で、
IP=`echo $IP | tr -d '\r'`
を実行してから cat 以下を実行すれば良い。
0492名無しさん@お腹いっぱい。
2006/03/10(金) 07:43:37ありがとうございます!
感謝感謝!
0493名無しさん@お腹いっぱい。
2006/03/10(金) 09:44:510494名無しさん@お腹いっぱい。
2006/03/10(金) 09:55:470495名無しさん@お腹いっぱい。
2006/03/10(金) 10:50:22というか、シェルスクリプト自体が^M付きなんだろ?
cat << EOF > /home/test.txt^M
ip='${IP}'^M
EOF^M
0496名無しさん@お腹いっぱい。
2006/03/10(金) 12:10:49いや、それだと #!/bin/sh^M で動作しないし、
test.txt^Mを読むにも苦労するはずだから、
そういうわけではないはず。
0497名無しさん@お腹いっぱい。
2006/03/10(金) 12:12:55あ、それに、EOF^Mになるから、cat自体が終了しないじゃないか。
よって、シェルスクリプト自体には ^Mが付いていない、が正解。
IP=を書いたファイルのみ ^M が付いていると思われ。
0498名無しさん@お腹いっぱい。
2006/03/10(金) 15:53:040499名無しさん@お腹いっぱい。
2006/03/10(金) 15:58:360500名無しさん@お腹いっぱい。
2006/03/10(金) 16:55:470501名無しさん@お腹いっぱい。
2006/03/10(金) 17:13:53catが ^Mを付けてるんじゃなくて、
ヒアドキュメントの $IPが展開される時、
シェル変数IPの中には、もともとの別ファイルにあった ^Mが入っているので、
これがそのまま展開されるという話だろ。
というか、>>492 で解決したって言ってるんだから、
それ以上言うことないだろ。
0502名無しさん@お腹いっぱい。
2006/03/10(金) 17:24:120503名無しさん@お腹いっぱい。
2006/03/10(金) 22:22:02> IP=111.222.333.444
こんなIPアドレスNEEEEEEEEEE!
0504名無しさん@お腹いっぱい。
2006/03/10(金) 22:34:03例示のためにわざとありえないIPを書いたんだろ。
グローバルなIPを例示したい時、こういう書き方をすることがある。
0505名無しさん@お腹いっぱい。
2006/03/10(金) 23:25:400506名無しさん@お腹いっぱい。
2006/03/10(金) 23:32:160507名無しさん@お腹いっぱい。
2006/03/11(土) 08:29:05>>グローバルなIPを例示したい時、こういう書き方をすることがある。
ねーよ
0508名無しさん@お腹いっぱい。
2006/03/11(土) 09:17:20アルファベットで外人の名前を書くぐらいにありえないな。
つまり、そういう例示をする奴は度外れて常識がない門外漢。
0509名無しさん@お腹いっぱい。
2006/03/11(土) 09:18:140510名無しさん@お腹いっぱい。
2006/03/11(土) 09:32:180511名無しさん@お腹いっぱい。
2006/03/11(土) 09:48:50あるだろ。プライベートIPなら、
192.168.12.34 とか適当に例示して問題ないけど、
グローバルだと、実在する可能性があるので例示が難しい。
だから、わざと256以上のオクテットを含ませておいて例示する。
0512名無しさん@お腹いっぱい。
2006/03/11(土) 09:50:470513名無しさん@お腹いっぱい。
2006/03/11(土) 10:08:50それって、RFCか何かで決まってるの?
あと、クラスBやクラスAのアドレスを例示したい時はどうするの?
0514名無しさん@お腹いっぱい。
2006/03/11(土) 10:18:00RFC3330
今どきクラスなんて使わん。
0515名無しさん@お腹いっぱい。
2006/03/11(土) 10:47:46今どきCIDRなのは知ってるが、
ナチュラルマスクの関係で、
あえてClass A or Bのアドレスを例示したい時はどうするの?
0516名無しさん@お腹いっぱい。
2006/03/11(土) 10:49:580517名無しさん@お腹いっぱい。
2006/03/11(土) 11:29:580518名無しさん@お腹いっぱい。
2006/03/11(土) 11:31:46もっとグローバルっぽいアドレスで例示したいというのもあるわな。
RFCもまだ比較的新しいから、example.comに比べてあまり浸透していないと思う。
0519名無しさん@お腹いっぱい。
2006/03/11(土) 11:52:33ためになった…。知らんかった。
ただ、 111.222.333.444 はアレだ。デジャヴ。
某所で俺の嫌いな某コテが使っていたのだが、真似したいとは思わないなあ。
0520名無しさん@お腹いっぱい。
2006/03/11(土) 15:28:480521名無しさん@お腹いっぱい。
2006/03/11(土) 15:30:34村上春樹はパスタでも茹でてろ
0522名無しさん@お腹いっぱい。
2006/03/11(土) 15:30:380523名無しさん@お腹いっぱい。
2006/03/11(土) 15:43:330524名無しさん@お腹いっぱい。
2006/03/11(土) 16:40:17クラスA: 12.345.67.8
クラスB: 132.456.7.89
クラスC: 210.345.6.78
RFCなんかより、これの方がそれっぽくてわかりやすいでしょ。
0525名無しさん@お腹いっぱい。
2006/03/11(土) 16:49:280526名無しさん@お腹いっぱい。
2006/03/11(土) 17:02:190527名無しさん@お腹いっぱい。
2006/03/11(土) 17:15:51というカキコに対して一言
↓↓↓
0528名無しさん@お腹いっぱい。
2006/03/11(土) 17:39:550529名無しさん@お腹いっぱい。
2006/03/11(土) 18:21:470530名無しさん@お腹いっぱい。
2006/03/11(土) 18:30:43普通の人はそれを見ても、面と向かっては何も言わないだろうけど、
内心はこのスレで付いたレスの様な事を考えてると思うよ。
オイオイ、何だコイツって。
それに、何も知らない初心者が真似したら可哀想だよ。
0531名無しさん@お腹いっぱい。
2006/03/11(土) 20:06:07このアイデア頂きます。
某製品の取説を担当している者ですが、
WAN側の設定例でのIPで、xxxや***じゃわかりにくいと言われ、
どうしたものかと考えていたところでした。
自社のグローバルIPを使う事も考えましたが、
これも変更の可能性もあるし、使うのはまずいと思っていたところでした。
0532名無しさん@お腹いっぱい。
2006/03/11(土) 20:39:590533名無しさん@お腹いっぱい。
2006/03/11(土) 21:41:49って俺はそんな突っ込みなんてしないクマー
0534名無しさん@お腹いっぱい。
2006/03/11(土) 22:46:120535名無しさん@お腹いっぱい。
2006/03/11(土) 22:50:16そういう指摘は「シェルってゆーな」と同レベル。
0536名無しさん@お腹いっぱい。
2006/03/11(土) 22:56:080537名無しさん@お腹いっぱい。
2006/03/11(土) 23:20:320538名無しさん@お腹いっぱい。
2006/03/11(土) 23:39:43例ならいいじゃん。
実際に振るわけじゃないし。
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:32■ このスレッドは過去ログ倉庫に格納されています