トップページunix
1001コメント273KB

シェルスクリプト総合 その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 でトレースしましょう。
0492名無しさん@お腹いっぱい。2006/03/10(金) 07:43:37
>>491
ありがとうございます!
感謝感謝!
0493名無しさん@お腹いっぱい。2006/03/10(金) 09:44:51
物凄いレベルの低さだなw
0494名無しさん@お腹いっぱい。2006/03/10(金) 09:55:47
( ´∀`) オマエモナー
0495名無しさん@お腹いっぱい。2006/03/10(金) 10:50:22
>>491
というか、シェルスクリプト自体が^M付きなんだろ?

cat << EOF > /home/test.txt^M
ip='${IP}'^M
EOF^M
0496名無しさん@お腹いっぱい。2006/03/10(金) 12:10:49
>>495
いや、それだと #!/bin/sh^M で動作しないし、
test.txt^Mを読むにも苦労するはずだから、
そういうわけではないはず。
0497名無しさん@お腹いっぱい。2006/03/10(金) 12:12:55
>>495
あ、それに、EOF^Mになるから、cat自体が終了しないじゃないか。
よって、シェルスクリプト自体には ^Mが付いていない、が正解。

IP=を書いたファイルのみ ^M が付いていると思われ。
0498名無しさん@お腹いっぱい。2006/03/10(金) 15:53:04
みんなイジワルですねw
0499名無しさん@お腹いっぱい。2006/03/10(金) 15:58:36
dos2ux ハァハァ
0500名無しさん@お腹いっぱい。2006/03/10(金) 16:55:47
しかし cat が ^Mつけるってのも解せない話だよなあ。
0501名無しさん@お腹いっぱい。2006/03/10(金) 17:13:53
>>500
catが ^Mを付けてるんじゃなくて、
ヒアドキュメントの $IPが展開される時、
シェル変数IPの中には、もともとの別ファイルにあった ^Mが入っているので、
これがそのまま展開されるという話だろ。

というか、>>492 で解決したって言ってるんだから、
それ以上言うことないだろ。
0502名無しさん@お腹いっぱい。2006/03/10(金) 17:24:12
まぁ茶でも飲めや( ゚Д゚)⊃旦旦旦旦旦
0503名無しさん@お腹いっぱい。2006/03/10(金) 22:22:02
解決したことをうだうだ言っても仕方ないけど…

> IP=111.222.333.444

こんなIPアドレスNEEEEEEEEEE!
0504名無しさん@お腹いっぱい。2006/03/10(金) 22:34:03
>>503
例示のためにわざとありえないIPを書いたんだろ。
グローバルなIPを例示したい時、こういう書き方をすることがある。
0505名無しさん@お腹いっぱい。2006/03/10(金) 23:25:40
相変わらずレベル低いなw
0506名無しさん@お腹いっぱい。2006/03/10(金) 23:32:16
( ´∀`) オマエモナー
0507名無しさん@お腹いっぱい。2006/03/11(土) 08:29:05
>>504
>>グローバルなIPを例示したい時、こういう書き方をすることがある。
ねーよ
0508名無しさん@お腹いっぱい。2006/03/11(土) 09:17:20
日本人のパスポート申請書類のサンプルに
アルファベットで外人の名前を書くぐらいにありえないな。

つまり、そういう例示をする奴は度外れて常識がない門外漢。
0509名無しさん@お腹いっぱい。2006/03/11(土) 09:18:14
シェルスクリプトって書けると幸せですか?
0510名無しさん@お腹いっぱい。2006/03/11(土) 09:32:18
時給いくらで働いている派遣は仕事が一瞬で終わってしまうので、不幸になります。
0511名無しさん@お腹いっぱい。2006/03/11(土) 09:48:50
>>507
あるだろ。プライベートIPなら、
192.168.12.34 とか適当に例示して問題ないけど、
グローバルだと、実在する可能性があるので例示が難しい。
だから、わざと256以上のオクテットを含ませておいて例示する。
0512名無しさん@お腹いっぱい。2006/03/11(土) 09:50:47
例示は 192.0.2.0/24 使え。
0513名無しさん@お腹いっぱい。2006/03/11(土) 10:08:50
>>512
それって、RFCか何かで決まってるの?
あと、クラスBやクラスAのアドレスを例示したい時はどうするの?
0514名無しさん@お腹いっぱい。2006/03/11(土) 10:18:00
>>513
RFC3330
今どきクラスなんて使わん。
0515名無しさん@お腹いっぱい。2006/03/11(土) 10:47:46
>>514
今どきCIDRなのは知ってるが、
ナチュラルマスクの関係で、
あえてClass A or Bのアドレスを例示したい時はどうするの?
0516名無しさん@お腹いっぱい。2006/03/11(土) 10:49:58
さぁ?
0517名無しさん@お腹いっぱい。2006/03/11(土) 11:29:58
やれやれ
0518名無しさん@お腹いっぱい。2006/03/11(土) 11:31:46
1バイト目が192だと、ぱっと見192.168と紛らわしいから、
もっとグローバルっぽいアドレスで例示したいというのもあるわな。

RFCもまだ比較的新しいから、example.comに比べてあまり浸透していないと思う。
0519名無しさん@お腹いっぱい。2006/03/11(土) 11:52:33
>>513-515
ためになった…。知らんかった。

ただ、 111.222.333.444 はアレだ。デジャヴ。
某所で俺の嫌いな某コテが使っていたのだが、真似したいとは思わないなあ。
0520名無しさん@お腹いっぱい。2006/03/11(土) 15:28:48
相変わらずレベル低いなw
0521名無しさん@お腹いっぱい。2006/03/11(土) 15:30:34
>>517
村上春樹はパスタでも茹でてろ
0522名無しさん@お腹いっぱい。2006/03/11(土) 15:30:38
( ´∀`) オマエモナー
0523名無しさん@お腹いっぱい。2006/03/11(土) 15:43:33
相変わらずレベル低いなw
0524名無しさん@お腹いっぱい。2006/03/11(土) 16:40:17
オレ的例示用IPアドレスの推奨:

クラスA: 12.345.67.8
クラスB: 132.456.7.89
クラスC: 210.345.6.78

RFCなんかより、これの方がそれっぽくてわかりやすいでしょ。
0525名無しさん@お腹いっぱい。2006/03/11(土) 16:49:28
スレ違いの上に内容も馬鹿
0526名無しさん@お腹いっぱい。2006/03/11(土) 17:02:19
相変わらずレベル低いなw
0527名無しさん@お腹いっぱい。2006/03/11(土) 17:15:51
「相変わらずレベル低いなw 」って言うだけの煽ラーがいますね。





というカキコに対して一言
↓↓↓
0528名無しさん@お腹いっぱい。2006/03/11(土) 17:39:55
死ねや、ハゲ
0529名無しさん@お腹いっぱい。2006/03/11(土) 18:21:47
相変わらずレベル低いなw
0530名無しさん@お腹いっぱい。2006/03/11(土) 18:30:43
>>524
普通の人はそれを見ても、面と向かっては何も言わないだろうけど、
内心はこのスレで付いたレスの様な事を考えてると思うよ。
オイオイ、何だコイツって。

それに、何も知らない初心者が真似したら可哀想だよ。
0531名無しさん@お腹いっぱい。2006/03/11(土) 20:06:07
>>524
このアイデア頂きます。
某製品の取説を担当している者ですが、
WAN側の設定例でのIPで、xxxや***じゃわかりにくいと言われ、
どうしたものかと考えていたところでした。
自社のグローバルIPを使う事も考えましたが、
これも変更の可能性もあるし、使うのはまずいと思っていたところでした。
0532名無しさん@お腹いっぱい。2006/03/11(土) 20:39:59
悪い事言わんから止めとけ。
0533名無しさん@お腹いっぱい。2006/03/11(土) 21:41:49
>>531 はネタだということに気づけ。

って俺はそんな突っ込みなんてしないクマー
0534名無しさん@お腹いっぱい。2006/03/11(土) 22:46:12
IPアドレスをIPなどと呼ぶ時点で…
0535名無しさん@お腹いっぱい。2006/03/11(土) 22:50:16
>>534
そういう指摘は「シェルってゆーな」と同レベル。
0536名無しさん@お腹いっぱい。2006/03/11(土) 22:56:08
そだな。相変わらずレベル低いなw
0537名無しさん@お腹いっぱい。2006/03/11(土) 23:20:32
IPってゆうな。クズ。
0538名無しさん@お腹いっぱい。2006/03/11(土) 23:39:43
>>530
例ならいいじゃん。
実際に振るわけじゃないし。
0539名無しさん@お腹いっぱい。2006/03/11(土) 23:53:01
そだな。相変わらずレベル低いなw
0540名無しさん@お腹いっぱい。2006/03/12(日) 00:05:30
こういう例を挙げとくと、サポセンに「256以上はありえない」という電話が
間違いなくかかってくる。
0541名無しさん@お腹いっぱい。2006/03/12(日) 00:13:26
あと、プライベートアドレスで例示したのに、
「そのアドレスは私が使っているものですから公表しないでください」という
怖いメールが来ることも…
0542名無しさん@お腹いっぱい。2006/03/12(日) 00:31:20
もちろん
「どうして RFC に書いてあるとおりにしないんですかっ!?!?!!!111!!」
というお怒りのメールが来ることもあるのだろうな。
0543名無しさん@お腹いっぱい。2006/03/12(日) 00:44:04
相変わらずレベル低いなw
0544名無しさん@お腹いっぱい。2006/03/12(日) 01:08:35
   ∧_∧  / ̄ ̄ ̄ ̄ ̄
  ( ´∀`)< オマエモナー
  (    )  \_____
  | | |
  (__)_)
0545名無しさん@お腹いっぱい。2006/03/12(日) 02:42:17
おれは別にレベル低くないよ。
0546名無しさん@お腹いっぱい。2006/03/12(日) 02:57:49
>>541
懐かしいネタだな。
0547名無しさん@お腹いっぱい。2006/03/12(日) 03:32:48
>>538
個人のメモ書き程度なら何も言わんが、人の目に触れる様な所で使うのは止めとけ。
0548名無しさん@お腹いっぱい。2006/03/12(日) 08:46:56
>>540
※注 例として256以上のオクテットを含むIPアドレスを表示しています。

と、同じページに注釈を入れておけば無問題。


>>542
RFCでは192で始まるアドレスなので紛らわしい。
RFC云々を言うものはかなりの上級者なので、
こういう事でいちいち電話しない。
0549名無しさん@お腹いっぱい。2006/03/12(日) 09:43:00
WAN側のインターフェイスが2系統以上ある場合も、
RFCの192.0.2.xxx だけじゃ表現できず、困りますな。
まさか192.0.2.xxxをさらにネットマスクで分けたりしても
例示としてさらに紛らわしくなるだけ。
0550名無しさん@お腹いっぱい。2006/03/12(日) 10:09:42
ここで言われてもなぁ。
RFC 書いたら?
0551名無しさん@お腹いっぱい。2006/03/12(日) 10:36:30
相変わらずレベル低いなw
0552名無しさん@お腹いっぱい。2006/03/12(日) 11:20:32
・∀・)ニヤニヤ
0553名無しさん@お腹いっぱい。2006/03/12(日) 12:28:35
RFCに従う必要なし。
好き勝手にやればいいんだよ。シェア取ったもん勝ちなんだから。
RFCを神みたく崇め奉ってる奴ってバカ。
0554名無しさん@お腹いっぱい。2006/03/12(日) 12:28:54
>>550
RFC書く労力使うくらいなら、語呂のいい数字の組合せで商標登録しますw
0555名無しさん@お腹いっぱい。2006/03/12(日) 12:41:54
中国が独自ドメインを作るとかいってたけど、
あれはRFCに沿ってるの?
0556名無しさん@お腹いっぱい。2006/03/12(日) 12:45:22
>>554
晒しage
0557名無しさん@お腹いっぱい。2006/03/12(日) 14:08:17
>>548
「256以上のオクテット」がそもそも矛盾してないか?
符号無し整数なら 255 までなのに。
0558名無しさん@お腹いっぱい。2006/03/12(日) 14:33:21
相変わらずレベル低いなw
0559名無しさん@お腹いっぱい。2006/03/12(日) 18:17:59
>>557
あり得ないアドレスを例に使うために、どこかを矛盾させなければならないのは当然。
敢えて矛盾させています、という注釈だろ。だからそれはおかしくない。
0560名無しさん@お腹いっぱい。2006/03/12(日) 18:24:03
そこまでしてやる必要が在るのか?
0561名無しさん@お腹いっぱい。2006/03/12(日) 18:48:58
花子さんから太郎くんへパケットを送るには、
太郎さんのアドレス「富.士.見.町」を指定する必要があります。
0562名無しさん@お腹いっぱい。2006/03/12(日) 19:40:16
>>561 の方がよっぽどマシだな。
0563名無しさん@お腹いっぱい。2006/03/12(日) 20:04:33
なんでやねん
0564名無しさん@お腹いっぱい。2006/03/12(日) 20:08:01
こんな感じか

  ホストA       ホストB
   | 富.士.見.町   | 御.殿.場.市
  −+−−−−−−−+−−

    図1 ネットワーク構成の例
0565名無しさん@お腹いっぱい。2006/03/12(日) 20:52:49
ホストクラブばっかだな。
0566名無しさん@お腹いっぱい。2006/03/12(日) 20:58:52
相変わらず気持ち悪いなw
0567名無しさん@お腹いっぱい。2006/03/12(日) 21:00:00
以下のようなcopyというシェルを作りたいので、教えてください。
copy[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
>>570
それだと、ディレクトリが一旦指定された場合に、そのディレクトリの情報が
サブシェルに渡らないのでは? あと、延々ディレクトリを入力すると
プロセスが増え続ける。

つーか、>>567 に対する答えはひとつ「宿題禁止!!」
0572名無しさん@お腹いっぱい。2006/03/12(日) 22:15:47
板違いだが、「電解コンデンサのことをコンデンサってゆーな」には同意だな。
更には「コンデンサには寿命がある」とか言い出す香具師まで居る始末。
そもそも「電解」コンデンサだけが寿命があって特殊なんだよ。
一般的なセラミックやポリカーボネイトには寿命がなく、半永久で使える。
0573名無しさん@お腹いっぱい。2006/03/12(日) 22:29:20
ネタレスやスレ違いばっかで、たとえ宿題でも >>567 の質問がマトモに見える。
0574名無しさん@お腹いっぱい。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:54
こんな汚いスクリプトはじめて見た
0576名無しさん@お腹いっぱい。2006/03/12(日) 23:39:28
575先生のお手並みを拝見!
0577名無しさん@お腹いっぱい。2006/03/12(日) 23:57:49
>>576
こんな感じで。

富.士.見.0/24でクラスCだから、
ホストA: 富.士.見.町
ホストB: 富.士.見.台
0578名無しさん@お腹いっぱい。2006/03/13(月) 01:56:29
>>576
ということは>>547の汚さには同意したわけだな。
0579名無しさん@お腹いっぱい。2006/03/13(月) 02:36:02
んー、汚いとまでは思わないけど… Perlはもっとひどいよね。

WD設定する前に使ってるところとか、再度ファイル名を聞く処理が抜けてたりして
いい加減だなとは思う。まあ、対話的にファイル名入力させるコマンドなんか
死んでも使わないからどうでもいいけどさあ。
0580名無しさん@お腹いっぱい。2006/03/13(月) 03:53:31
>>567
cp、read、test、echo あたりを使えば出来る。
後は man を見て頑張れ。
0581名無しさん@お腹いっぱい。2006/03/13(月) 08:15:12
再度ファイル名を聞く処理は実装されてるでしょ。再帰してるし。
0582名無しさん@お腹いっぱい。2006/03/13(月) 08:52:56
>>581
コピー元ファイルが存在しなかった時に聞き直す処理が実装されていないようだが・・
0583名無しさん@お腹いっぱい。2006/03/13(月) 09:14:14
$tofileがディレクトリで、再帰して、
再帰実行した自分が失敗して帰った来た時に、cp強行が汚いどす。

$ true && true || echo done
$ true && false || echo done
done

0584名無しさん@お腹いっぱい。2006/03/13(月) 09:15:30
再帰呼出しせずに execすればプロセスは増えない。
さらに、自分をexecするんじゃなく、
whileループの中で、再入力ならcontinueするようにすれば
execする必要もなくなる。
と、ヒントだけ書いておこう。
0585名無しさん@お腹いっぱい。2006/03/13(月) 09:19:09
whileを使う処理が真っ先に思い浮かぶ人間はC出身だと思う。
再帰を使う処理が真っ先に思い浮かぶ人間はLisp出身だと思う。
0586名無しさん@お腹いっぱい。2006/03/13(月) 12:54:27
gotoを使う処理が真っ先に思い浮かぶ人間は(ry
0587名無しさん@お腹いっぱい。2006/03/13(月) 14:21:16
何だ
言ってみろ
0588名無しさん@お腹いっぱい。2006/03/13(月) 15:00:15
真のプログラマ。

「真のプログラマはgotoを恐れない」
0589名無しさん@お腹いっぱい。2006/03/13(月) 15:54:22
ども、後藤です。
0590名無しさん@お腹いっぱい。2006/03/13(月) 15:56:49
どうも倉間です
0591名無しさん@お腹いっぱい。2006/03/13(月) 16:12:04
>>567 の例題で gotoを発想するプログラマはヴァカ。
というか、/bin/shにgotoはないし、break 2以上ができるので
gotoは根本的に排除されている。

まあ、gotoがあるcshみたいなアフォなシェルもあるが・・
■ このスレッドは過去ログ倉庫に格納されています