トップページ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 でトレースしましょう。
0701名無しさん@お腹いっぱい。2006/03/16(木) 14:07:40
>>699
date +%y%m%d でできるよ。yは小文字。
ただし、%yは2000年問題の関係で推奨されない。

>>700
質問欲嫁。この場合 man strftimeしても解決しないだろ。
07026992006/03/16(木) 15:08:28
701

ありがとうございました。
できました。
すごく単純なコマンドで出来たんですね(汗)

0703名無しさん@お腹いっぱい。2006/03/16(木) 15:50:11
>ただし、%yは2000年問題の関係で推奨されない。

そんなの用途しだいでしょ。
昔のデータなんか扱わないようなところとか。

>質問欲嫁。この場合 man strftimeしても解決しないだろ。

man date するとたいてい strftime(3) を参照と書いてないか?
0704名無しさん@お腹いっぱい。2006/03/16(木) 15:58:12
>>703
man dateしたなら、すでに %y のことは書いてある。
strftime(3)のことは書かれていなかった。
0705名無しさん@お腹いっぱい。2006/03/16(木) 15:58:44
strftime(3)にでてるじゃん
誰だよ,解決しないとか言ってる奴
0706名無しさん@お腹いっぱい。2006/03/16(木) 16:02:45
>>705
strftimeはC言語の関数。
そっちに載っていたとしても、回答としては不適切。
もっとそのものズバリのman dateがあるのだから。
なんでわざわざ遠い回答するの?
0707名無しさん@お腹いっぱい。2006/03/16(木) 16:03:27
「man hoge」厨は、よく確認せずにカキコするため、回答をハズしやすいの法則。
0708名無しさん@お腹いっぱい。2006/03/16(木) 16:06:31
ごめんdateコマンドだったか
0709名無しさん@お腹いっぱい。2006/03/16(木) 16:07:43
おそらく >>700 は、dateコマンドでも +%y が使えることを知らず、
そういうことがやりたいなら strftime() を使って、
C言語でプログラムを書け、と言いたかったんじゃないかな。
それが、実は date +%y で簡単にできてしまうことがわかり、
突っ込まれたので暴れているわけだ。
0710名無しさん@お腹いっぱい。2006/03/16(木) 16:08:24
>>706
FreeBSD で man date を確認すると
% を使った詳細の書式は載っていない。
man strftime ならたぶんどの OS でも載ってるっしょ。
0711名無しさん@お腹いっぱい。2006/03/16(木) 16:09:06
>>709
>>703
07127002006/03/16(木) 16:14:40
>>709
>>703>>705 はおれじゃないよ。
0713名無しさん@お腹いっぱい。2006/03/16(木) 16:14:58
>>710
いきなり man strftimeしても、質問者にとっては、
それがdateで使えるとはわからない。
載っているのはC言語なので、最初の数行読んで「違う」「ガセネタだ」と
思うだろう。

man strftimeとか言わずに、
>>701 みたいに date +%y%m%d と、直接回答するのが
もっとも価値が高い回答ではないだろうか。
0714名無しさん@お腹いっぱい。2006/03/16(木) 16:21:42
この板最近回答者への要求きついね。
回答控えようかな。
0715名無しさん@お腹いっぱい。2006/03/16(木) 16:47:32
FreeBSDでman dateでこれだけ載ってりゃ十分じゃ内科医
--------------------------------
yy 西暦の省略表現です。西暦の 10 の位と 1 の位です (1989 年なら 89、06 なら 2006)。
〜中略〜
使用例
以下のコマンド:
date "+DATE: %Y-%m-%d%nTIME: %H:%M:%S"
は、下のような表示を行ないます。
DATE: 1987-11-21
TIME: 13:36:16
0716名無しさん@お腹いっぱい。2006/03/16(木) 16:52:51
だから今のコンテキストでは、%y が載ってないのはクズ
0717名無しさん@お腹いっぱい。2006/03/16(木) 16:59:42
確認してみたが、SolarisとLinuxのman dateでは %yの他、%の書式解説が載ってるぞ。
遠回しなman書いてるFreeBSDはクズ。
0718名無しさん@お腹いっぱい。2006/03/16(木) 17:01:55
手元の Solaris9 の man にはないようだが……。
0719名無しさん@お腹いっぱい。2006/03/16(木) 17:06:55
date(1)には書式文字列はstrftime(3)に載っているっ
て書いてあるけど。strftime(3)は遠回りでもなんでも
なく、直球だと思う。まぁ、date(1)にstrftime(3)を
見ろと載っていると一言あってもいいけど。

An operand with a leading plus (`+') sign signals a user-defined format
string which specifies the format in which to display the date and time.
The format string may contain any of the conversion specifications
described in the strftime(3) manual page, as well as any arbitrary text.

つーか、質問者以外が難癖つけすぎ。
0720名無しさん@お腹いっぱい。2006/03/16(木) 17:08:10
というか、Solarisの場合manは非標準で、標準はアンサーブックとかに変わったし、
Solarisスレでは二言めには docs.sun.com読め、なので、manは標準じゃないのだろう。
0721名無しさん@お腹いっぱい。2006/03/16(木) 17:10:52
>>719
だからぁ、それはFreeBSDの場合なんだって。
そもそも、dateコマンドで行けるかどうかの情報すらない段階で、
man strftimeでは意味が通じないよ。

元が「dateの書式が知りたい」という質問なら
man strftimeでもわかるけど。

実際にはそうじゃない。
0722名無しさん@お腹いっぱい。2006/03/16(木) 17:21:47
質問者の >>699 は、8桁日付の date +%Y%m%d については知っている。
これを、6桁にしようと、awkのsubstr関数を使うことを考えていた。

この段階で、質問者は「dateコマンドだけではできない」と
考えていたと推定できる。

すると回答としては、まず、「dateだけでできるんだよ」ということを
教えてやらないといけない。

ところが、ここで「man strftime」などと回答すると、
「dateの出力をstrftimeというコマンド(←実際にはない)で加工する」
あるいはawkを考えているため「awkにstrftimeという関数がある?」
などと、誤った方向に誘導してしまう。

だから、manなどで回答するのではなく、

`date +%y%m%d`

と一言いえば済むことだったのだ。
0723名無しさん@お腹いっぱい。2006/03/16(木) 17:33:12
回答者は date でできるのが分かってたんだから、man を良く嫁で良かったんじゃないのか。
直接、答えを教えるのは良くないよ。
0724名無しさん@お腹いっぱい。2006/03/16(木) 17:38:09
manで回答する香具師って、実際に動作確認せずに回答してるだろ。
オレはその点が気になる。
シェルスクリプトとして動作確認してるなら、
回答は直接のコマンドラインになるはず。

直接答を書くというか、動作確認のためにそれは必要なこと。
0725名無しさん@お腹いっぱい。2006/03/16(木) 17:38:45
なんで701はこんなに必死になってるんですか?
0726名無しさん@お腹いっぱい。2006/03/16(木) 17:43:37
>>714
元々モマエは役に立ってないから
イエローで首括って良いよ
0727名無しさん@お腹いっぱい。2006/03/16(木) 17:52:51
>>724
仮に動作確認のために動かしても、マニュアルに載ってることは答えを
直接書くべきじゃない。回答者の学ぶ機会を奪うのか?
0728名無しさん@お腹いっぱい。2006/03/16(木) 17:54:15
>あるいはawkを考えているため「awkにstrftimeという関数がある?」
>などと、誤った方向に誘導してしまう。

GNU awk にはあるよ。その man でもちゃんと strftime(3) に誘導してる。
0729名無しさん@お腹いっぱい。2006/03/16(木) 17:56:39
>>728
awkにstrftimeがあるのは知ってるよ。
だからこそ紛らわしいと言ってるんだ。
dateでできるのにわざわざawkでやると無駄だろ。
しかも、awkのstrftimeでdateみたいに表示させるの、
結構記述量多くなるよ。
0730名無しさん@お腹いっぱい。2006/03/16(木) 18:00:42
余談だけど、
awk 'BEGIN { print strftime("%y%m%d") }'
だね。

確かに、こんなこと書くより、

date +%y%m%d
の方がエレガントだね。
0731名無しさん@お腹いっぱい。2006/03/16(木) 18:06:32
>>727
>回答者の学ぶ機会を奪うのか?

確かに、「回答者」こそいい回答方法を学んで欲しいよねw
man回答は最低。
07326802006/03/16(木) 21:08:35
すみません。>>680 がまだ解答が付いてないんですが、
よろしければこれをネタに、解答者バトルをお願いします。
0733名無しさん@お腹いっぱい。2006/03/16(木) 21:19:53
こんなUNIXを打ってください
sh -c 'for i in *; do mv $i `echo $i | tr a-z A-Z`; done'
0734名無しさん@お腹いっぱい。2006/03/16(木) 21:24:16
>>733
逆に大文字に変換してるのはわざと?
あと、sh -c が無駄。
cshユーザーは居ないという大前提があるので、
sh -c する必要なし。
0735名無しさん@お腹いっぱい。2006/03/16(木) 21:33:23
>>734
> 逆に大文字に変換してるのはわざと?
素でまちがえただけよ
0736名無しさん@お腹いっぱい。2006/03/16(木) 21:35:48
もっとハデなバトルネタきぼん
07376802006/03/16(木) 21:41:44
>>733
ありがとうございます。733のUNIXを打つと途中まで行けるんですが、
My Document.txt というファイルがあるところでエラーになります。
こういうファイルも対応できるUNIXの打ち方はありませんか?
0738名無しさん@お腹いっぱい。2006/03/16(木) 21:50:22
「UNIXを打つ」ってすげぇ表現だな
0739名無しさん@お腹いっぱい。2006/03/16(木) 21:53:02
>tr a-z A-Z
あれ?
[]がいるんじゃね?
0740名無しさん@お腹いっぱい。2006/03/16(木) 21:55:12
>>739
man tr
[]はいらねーよ。正規表現じゃないんだから。
0741名無しさん@お腹いっぱい。2006/03/16(木) 21:59:52
もまいら、ちゃんと動作チェックしてから書き込め。
それとも手元のPCがWinで、すぐにUNIXが打てないのかな?
0742名無しさん@お腹いっぱい。2006/03/16(木) 22:13:04
SysVの古いバージョンの tr だと [ ] が要ったらしい。
でも、Solarisの tr でも [ ] なしで動くので
[ ] はもう要らないのだろう。
0743名無しさん@お腹いっぱい。2006/03/16(木) 22:25:26
solaris8のマニュアルだと、
/usr/bin/trの場合は、[]がいるみたいだぞ。
/usr/xpg4/bin/trの場合はいらんみたいだが。
0744名無しさん@お腹いっぱい。2006/03/16(木) 22:35:09
Solaris9の/usr/bin/trだと [ ] なしで動いた。
manはインスコしてないので未確認。
manってうぜー。
現物確認が一番。
0745名無しさん@お腹いっぱい。2006/03/16(木) 23:01:05
manぐらい入れとけよ
0746名無しさん@お腹いっぱい。2006/03/16(木) 23:04:52
Solarisでは、「manは将来のリリースではサポートされない」みたいな記述を
何年か前に見たから、インスコしないことにしている。
LinuxのmanをNFSマウントしてそれを読んでるが、
それでだいたい間に合ってしまうんだよ。
0747名無しさん@お腹いっぱい。2006/03/16(木) 23:20:24
Linuxのmanって、なんか古い記述が残ってたり、テキトーなのが多くないか?
Solarisのmanの方が全然いいぞ
例えばThread-SafeかどうかSolarisのは全部書いてあるし
0748名無しさん@お腹いっぱい。2006/03/16(木) 23:21:34
>>746
聞いたことないなあ。"troff形式のマニュアルページ"もしくは
AnswerBook(もうリリースされてないけど)の間違いじゃないの?

ttp://docs.sun.com/app/docs/doc/819-0305/6n2o826je?a=view
ここにも載ってないし。
0749名無しさん@お腹いっぱい。2006/03/16(木) 23:59:48
>>747
> Linuxのmanって、なんか古い記述が残ってたり、テキトーなのが多くないか?

日本語の man はそういうの多いね。

--help オプションとかがあるコマンドなら
そっちで確認した方が確実だね。
0750名無しさん@お腹いっぱい。2006/03/17(金) 00:33:46
>>749
manも--helpオプションも間違ってて、
ソース読まざるをえないことが数度あった。

bashとかのでかいmanはよみにくいな。
0751名無しさん@お腹いっぱい。2006/03/17(金) 00:37:04
かといって、zshとかperlみたいなのもな
0752名無しさん@お腹いっぱい。2006/03/17(金) 00:43:18
-gつきでコンパイルしてあれば--sourceでソースが表示されるというのを標準にしよう
0753名無しさん@お腹いっぱい。2006/03/17(金) 00:52:25
perl は独自に分割されてていまいちわからん。
ああいうのなら info の方がいい。
0754名無しさん@お腹いっぱい。2006/03/17(金) 01:18:20
オマエら能書きは良いからUNIX打てよ
0755名無しさん@お腹いっぱい。2006/03/17(金) 01:20:07
>>746,747
Solarisのmanは、docs.sun.comと同じソースで、
かなり前からSGMLドキュメントがオリジナルになっている。
アンサーブックの時代にそうなった。

/usr/man/sman*
0756名無しさん@お腹いっぱい。2006/03/17(金) 06:56:13
で、>>737 に対応したUNIXは誰も打てないのかよ?
0757名無しさん@お腹いっぱい。2006/03/17(金) 07:16:05
しょーがねーなあ。少し上の方みりゃ分かると思うんだが。
for i in *; do mv "$i" "`echo "$i" | tr a-z A-Z`"; done
0758名無しさん@お腹いっぱい。2006/03/17(金) 07:18:36
誰か俺の心を揺さぶるようなUNIXを打ってくれ!
0759名無しさん@お腹いっぱい。2006/03/17(金) 07:24:11
UNIXを打ち込んでくれー!!
0760名無しさん@お腹いっぱい。2006/03/17(金) 07:32:58
つーか>>737 は普段windowsをクリックしてるんだろうけど
なんで突然UNIXを打たなきゃなんなかったのか気になる
0761名無しさん@お腹いっぱい。2006/03/17(金) 08:19:02
>>745
Solarisのインストール時に、最小インストールを選択すると manは入らないよ。
サーバー専用機などで Xが不要の場合、
End Userインストールより下には最小インストールしか選択肢がなく、
それを選んで manなしになっているマシンは多い。
0762名無しさん@お腹いっぱい。2006/03/17(金) 08:20:40
manぐらい入れとけよ
0763名無しさん@お腹いっぱい。2006/03/17(金) 08:53:22
manにtinを入れるってか。
0764名無しさん@お腹いっぱい。2006/03/17(金) 09:08:36
10台、100台とあるマシンに、同じmanのコピーをインストールするのは無駄。
しかも、manは実行ファイルでもあるまいし、サーバー専用機の場合、
サーバー機にloginしてmanを読むこと自体無駄。

あ、だからdocs.sun.comなのか。
0765名無しさん@お腹いっぱい。2006/03/17(金) 10:41:41
>>764
NFSでman積めば?
0766名無しさん@お腹いっぱい。2006/03/17(金) 11:05:40
セキュリティの関係でNFSを使えないサーバーもある。
0767名無しさん@お腹いっぱい。2006/03/17(金) 11:09:48
>>766
情報を後出しされてもなぁ
じゃmanサーバ立てて都度読みに行けば?
0768名無しさん@お腹いっぱい。2006/03/17(金) 11:22:58
>>764
けち臭いこというなw
0769名無しさん@お腹いっぱい。2006/03/17(金) 11:45:58
使わない実行ファイルだって山ほど入ってるだろうに
0770名無しさん@お腹いっぱい。2006/03/17(金) 11:55:43
まったくだ。昔のsun3とかの時代ならそりゃもうケチケチ使ってたよ。
find / -type f -atime +365 -exec rm -f {} \;
でも実行しとけ
0771名無しさん@お腹いっぱい。2006/03/17(金) 12:07:54
"Core System Support"で入れて、デフォでは入らない manを、
多数のマシンに pkgadd して回るなんて面倒なことはできない。
デフォで入らなかったというのはそれはそれで意味があるのだろうし、
あえてデフォの状態をいじりたくないというのもある。
0772名無しさん@お腹いっぱい。2006/03/17(金) 12:10:40
なら入れなきゃいいじゃん。
それをシェルスレで主張する意味がわからん。
0773名無しさん@お腹いっぱい。2006/03/17(金) 12:10:48
man co.jp
0774名無しさん@お腹いっぱい。2006/03/17(金) 12:13:17
シェルゆうな
0775名無しさん@お腹いっぱい。2006/03/17(金) 12:30:59

そうだよ、入れなきゃいいんだよ。
オレは入れるなとは主張していない。
「manくらい入れろ」と言ってる >>762 とかに
反論してるだけ。
0776名無しさん@お腹いっぱい。2006/03/17(金) 12:45:43
入れなくてもいいけど、man嫁って言われて切れるなよ
0777名無しさん@お腹いっぱい。2006/03/17(金) 13:01:09
言っとくけど、man入れてないオレは回答者側。
このスレで質問したことは一度もない。
回答は多数。

初心者の質問に、誰かが man嫁と回答してるのを見て、
その直後にもっとずばりの回答をしてるのがオレ。
manなんかで回答するんじゃないぞ。
0778名無しさん@お腹いっぱい。2006/03/17(金) 13:29:25
manぐらい入れとけよ
0779名無しさん@お腹いっぱい。2006/03/17(金) 13:30:42
manはそのマシンに入っているから価値があるんだろ。
0780名無しさん@お腹いっぱい。2006/03/17(金) 13:31:28
質問者はみんな man 入れてるよ。
0781名無しさん@お腹いっぱい。2006/03/17(金) 13:51:05
はやくUNIX書けよ
0782名無しさん@お腹いっぱい。2006/03/17(金) 13:58:49
>>777
> 初心者の質問に、誰かが man嫁と回答してるのを見て、
> その直後にもっとずばりの回答をしてるのがオレ。
質問者が調べる機会を奪っちゃいかんよ。
0783名無しさん@お腹いっぱい。2006/03/17(金) 14:25:41
>>777
でもオマエmanの入れ方解らないで教えてもらったじゃん
0784名無しさん@お腹いっぱい。2006/03/17(金) 16:11:11
僕にもmanの入れ方教えてくださいm(_ _)m
0785名無しさん@お腹いっぱい。2006/03/17(金) 17:15:07
結局manが使えないバカの再教育からUNIX打たないとダメか
0786名無しさん@お腹いっぱい。2006/03/17(金) 21:56:29
>>777
どのようにして、その先入観を打ち破る事が出来るのか。本当に悩ましい
0787名無しさん@お腹いっぱい。2006/03/17(金) 22:14:27
>>786
そのネタもう古い。もっと新しいの頼む。
0788名無しさん@お腹いっぱい。2006/03/17(金) 23:57:09
ずばりの回答か・・・ま、ほんとにずばりならいいが。
0789名無しさん@お腹いっぱい。2006/03/18(土) 00:07:22
ずっぽりの回答
0790名無しさん@お腹いっぱい。2006/03/18(土) 00:18:15
相変わらずレベル低いなw
0791名無しさん@お腹いっぱい。2006/03/18(土) 12:04:50
ここはmanについて考えるスレかよ!
man入れるか入れないかは別として回答としては>>701が一番良いと思うけどな。
>>699の人はある程度調べた後に質問したように見えるし、調べる方向が間違いつつあるようにも見える。
そういう人にはそのものずばりの回答を出せば、その人は自分で man date で回答を確かめる事をすると
思うよ。
0792名無しさん@お腹いっぱい。2006/03/18(土) 12:28:56
>>791
だから?
要するに君はここが相変わらずレベル低いと言いたかったわけだね
0793名無しさん@お腹いっぱい。2006/03/18(土) 13:22:42
>>791
ジサジエも飽きたから何か変わったUNIXを振ってくれよ
07947912006/03/18(土) 13:35:17
>>793
俺は701では無い。
manも入れてる。
ねたは無い。
0795名無しさん@お腹いっぱい。2006/03/18(土) 13:39:28
十代に若返ってナオンとずっこんばっこんできるスクリプトをお願いします
0796名無しさん@お腹いっぱい。2006/03/18(土) 14:01:41
>>795

#!/bin/sh
if [ $# -lt 1 ]; then
echo 'usage: manco YourAge' 1>&2
exit 1
fi
thisyear=`date +%Y`
year=`expr $thisyear - $1 + 16`
sudo date 01010000$year
echo 'Happy old year!'

man co
0797名無しさん@お腹いっぱい。2006/03/18(土) 14:03:36
動かしていると、自然にディレクトリ中にスクリプトが増えていくのはワームですか。
0798名無しさん@お腹いっぱい。2006/03/18(土) 14:13:13
バグです
0799名無しさん@お腹いっぱい。2006/03/18(土) 14:37:08
>>796
ありがとうございます。
早速実行してみましたが、
53歳だと、dateの実行のところでエラーになって
16歳に戻れません。
53歳以上にも対応したUNIXを打つ方法はありませんか?
08007962006/03/18(土) 14:44:14
>>799
楽観的な仕様と引数の範囲チェック無しで作成してしまいました。

>>793さん、変わったUNIXが振られましたのでよろしく。
■ このスレッドは過去ログ倉庫に格納されています