シェルスクリプト総合 その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:40date +%y%m%d でできるよ。yは小文字。
ただし、%yは2000年問題の関係で推奨されない。
>>700
質問欲嫁。この場合 man strftimeしても解決しないだろ。
0702699
2006/03/16(木) 15:08:28ありがとうございました。
できました。
すごく単純なコマンドで出来たんですね(汗)
0703名無しさん@お腹いっぱい。
2006/03/16(木) 15:50:11そんなの用途しだいでしょ。
昔のデータなんか扱わないようなところとか。
>質問欲嫁。この場合 man strftimeしても解決しないだろ。
man date するとたいてい strftime(3) を参照と書いてないか?
0704名無しさん@お腹いっぱい。
2006/03/16(木) 15:58:12man dateしたなら、すでに %y のことは書いてある。
strftime(3)のことは書かれていなかった。
0705名無しさん@お腹いっぱい。
2006/03/16(木) 15:58:44誰だよ,解決しないとか言ってる奴
0706名無しさん@お腹いっぱい。
2006/03/16(木) 16:02:45strftimeはC言語の関数。
そっちに載っていたとしても、回答としては不適切。
もっとそのものズバリのman dateがあるのだから。
なんでわざわざ遠い回答するの?
0707名無しさん@お腹いっぱい。
2006/03/16(木) 16:03:270708名無しさん@お腹いっぱい。
2006/03/16(木) 16:06:310709名無しさん@お腹いっぱい。
2006/03/16(木) 16:07:43そういうことがやりたいなら strftime() を使って、
C言語でプログラムを書け、と言いたかったんじゃないかな。
それが、実は date +%y で簡単にできてしまうことがわかり、
突っ込まれたので暴れているわけだ。
0710名無しさん@お腹いっぱい。
2006/03/16(木) 16:08:24FreeBSD で man date を確認すると
% を使った詳細の書式は載っていない。
man strftime ならたぶんどの OS でも載ってるっしょ。
0711名無しさん@お腹いっぱい。
2006/03/16(木) 16:09:06>>703
0713名無しさん@お腹いっぱい。
2006/03/16(木) 16:14:58いきなり 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--------------------------------
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:510717名無しさん@お腹いっぱい。
2006/03/16(木) 16:59:42遠回しなman書いてるFreeBSDはクズ。
0718名無しさん@お腹いっぱい。
2006/03/16(木) 17:01:550719名無しさん@お腹いっぱい。
2006/03/16(木) 17:06:55て書いてあるけど。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:10Solarisスレでは二言めには docs.sun.com読め、なので、manは標準じゃないのだろう。
0721名無しさん@お腹いっぱい。
2006/03/16(木) 17:10:52だからぁ、それはFreeBSDの場合なんだって。
そもそも、dateコマンドで行けるかどうかの情報すらない段階で、
man strftimeでは意味が通じないよ。
元が「dateの書式が知りたい」という質問なら
man strftimeでもわかるけど。
実際にはそうじゃない。
0722名無しさん@お腹いっぱい。
2006/03/16(木) 17:21:47これを、6桁にしようと、awkのsubstr関数を使うことを考えていた。
この段階で、質問者は「dateコマンドだけではできない」と
考えていたと推定できる。
すると回答としては、まず、「dateだけでできるんだよ」ということを
教えてやらないといけない。
ところが、ここで「man strftime」などと回答すると、
「dateの出力をstrftimeというコマンド(←実際にはない)で加工する」
あるいはawkを考えているため「awkにstrftimeという関数がある?」
などと、誤った方向に誘導してしまう。
だから、manなどで回答するのではなく、
`date +%y%m%d`
と一言いえば済むことだったのだ。
0723名無しさん@お腹いっぱい。
2006/03/16(木) 17:33:12直接、答えを教えるのは良くないよ。
0724名無しさん@お腹いっぱい。
2006/03/16(木) 17:38:09オレはその点が気になる。
シェルスクリプトとして動作確認してるなら、
回答は直接のコマンドラインになるはず。
直接答を書くというか、動作確認のためにそれは必要なこと。
0725名無しさん@お腹いっぱい。
2006/03/16(木) 17:38:450726名無しさん@お腹いっぱい。
2006/03/16(木) 17:43:37元々モマエは役に立ってないから
イエローで首括って良いよ
0727名無しさん@お腹いっぱい。
2006/03/16(木) 17:52:51仮に動作確認のために動かしても、マニュアルに載ってることは答えを
直接書くべきじゃない。回答者の学ぶ機会を奪うのか?
0728名無しさん@お腹いっぱい。
2006/03/16(木) 17:54:15>などと、誤った方向に誘導してしまう。
GNU awk にはあるよ。その man でもちゃんと strftime(3) に誘導してる。
0729名無しさん@お腹いっぱい。
2006/03/16(木) 17:56:39awkにstrftimeがあるのは知ってるよ。
だからこそ紛らわしいと言ってるんだ。
dateでできるのにわざわざawkでやると無駄だろ。
しかも、awkのstrftimeでdateみたいに表示させるの、
結構記述量多くなるよ。
0730名無しさん@お腹いっぱい。
2006/03/16(木) 18:00:42awk 'BEGIN { print strftime("%y%m%d") }'
だね。
確かに、こんなこと書くより、
date +%y%m%d
の方がエレガントだね。
0731名無しさん@お腹いっぱい。
2006/03/16(木) 18:06:32>回答者の学ぶ機会を奪うのか?
確かに、「回答者」こそいい回答方法を学んで欲しいよねw
man回答は最低。
0733名無しさん@お腹いっぱい。
2006/03/16(木) 21:19:53sh -c 'for i in *; do mv $i `echo $i | tr a-z A-Z`; done'
0734名無しさん@お腹いっぱい。
2006/03/16(木) 21:24:16逆に大文字に変換してるのはわざと?
あと、sh -c が無駄。
cshユーザーは居ないという大前提があるので、
sh -c する必要なし。
0735名無しさん@お腹いっぱい。
2006/03/16(木) 21:33:23> 逆に大文字に変換してるのはわざと?
素でまちがえただけよ
0736名無しさん@お腹いっぱい。
2006/03/16(木) 21:35:480737680
2006/03/16(木) 21:41:44ありがとうございます。733のUNIXを打つと途中まで行けるんですが、
My Document.txt というファイルがあるところでエラーになります。
こういうファイルも対応できるUNIXの打ち方はありませんか?
0738名無しさん@お腹いっぱい。
2006/03/16(木) 21:50:220739名無しさん@お腹いっぱい。
2006/03/16(木) 21:53:02あれ?
[]がいるんじゃね?
0740名無しさん@お腹いっぱい。
2006/03/16(木) 21:55:12man tr
[]はいらねーよ。正規表現じゃないんだから。
0741名無しさん@お腹いっぱい。
2006/03/16(木) 21:59:52それとも手元のPCがWinで、すぐにUNIXが打てないのかな?
0742名無しさん@お腹いっぱい。
2006/03/16(木) 22:13:04でも、Solarisの tr でも [ ] なしで動くので
[ ] はもう要らないのだろう。
0743名無しさん@お腹いっぱい。
2006/03/16(木) 22:25:26/usr/bin/trの場合は、[]がいるみたいだぞ。
/usr/xpg4/bin/trの場合はいらんみたいだが。
0744名無しさん@お腹いっぱい。
2006/03/16(木) 22:35:09manはインスコしてないので未確認。
manってうぜー。
現物確認が一番。
0745名無しさん@お腹いっぱい。
2006/03/16(木) 23:01:050746名無しさん@お腹いっぱい。
2006/03/16(木) 23:04:52何年か前に見たから、インスコしないことにしている。
LinuxのmanをNFSマウントしてそれを読んでるが、
それでだいたい間に合ってしまうんだよ。
0747名無しさん@お腹いっぱい。
2006/03/16(木) 23:20:24Solarisのmanの方が全然いいぞ
例えばThread-SafeかどうかSolarisのは全部書いてあるし
0748名無しさん@お腹いっぱい。
2006/03/16(木) 23:21:34聞いたことないなあ。"troff形式のマニュアルページ"もしくは
AnswerBook(もうリリースされてないけど)の間違いじゃないの?
ttp://docs.sun.com/app/docs/doc/819-0305/6n2o826je?a=view
ここにも載ってないし。
0749名無しさん@お腹いっぱい。
2006/03/16(木) 23:59:48> Linuxのmanって、なんか古い記述が残ってたり、テキトーなのが多くないか?
日本語の man はそういうの多いね。
--help オプションとかがあるコマンドなら
そっちで確認した方が確実だね。
0750名無しさん@お腹いっぱい。
2006/03/17(金) 00:33:46manも--helpオプションも間違ってて、
ソース読まざるをえないことが数度あった。
bashとかのでかいmanはよみにくいな。
0751名無しさん@お腹いっぱい。
2006/03/17(金) 00:37:040752名無しさん@お腹いっぱい。
2006/03/17(金) 00:43:180753名無しさん@お腹いっぱい。
2006/03/17(金) 00:52:25ああいうのなら info の方がいい。
0754名無しさん@お腹いっぱい。
2006/03/17(金) 01:18:200755名無しさん@お腹いっぱい。
2006/03/17(金) 01:20:07Solarisのmanは、docs.sun.comと同じソースで、
かなり前からSGMLドキュメントがオリジナルになっている。
アンサーブックの時代にそうなった。
/usr/man/sman*
0756名無しさん@お腹いっぱい。
2006/03/17(金) 06:56:130757名無しさん@お腹いっぱい。
2006/03/17(金) 07:16:05for i in *; do mv "$i" "`echo "$i" | tr a-z A-Z`"; done
0758名無しさん@お腹いっぱい。
2006/03/17(金) 07:18:360759名無しさん@お腹いっぱい。
2006/03/17(金) 07:24:110760名無しさん@お腹いっぱい。
2006/03/17(金) 07:32:58なんで突然UNIXを打たなきゃなんなかったのか気になる
0761名無しさん@お腹いっぱい。
2006/03/17(金) 08:19:02Solarisのインストール時に、最小インストールを選択すると manは入らないよ。
サーバー専用機などで Xが不要の場合、
End Userインストールより下には最小インストールしか選択肢がなく、
それを選んで manなしになっているマシンは多い。
0762名無しさん@お腹いっぱい。
2006/03/17(金) 08:20:400763名無しさん@お腹いっぱい。
2006/03/17(金) 08:53:220764名無しさん@お腹いっぱい。
2006/03/17(金) 09:08:36しかも、manは実行ファイルでもあるまいし、サーバー専用機の場合、
サーバー機にloginしてmanを読むこと自体無駄。
あ、だからdocs.sun.comなのか。
0765名無しさん@お腹いっぱい。
2006/03/17(金) 10:41:41NFSでman積めば?
0766名無しさん@お腹いっぱい。
2006/03/17(金) 11:05:400767名無しさん@お腹いっぱい。
2006/03/17(金) 11:09:48情報を後出しされてもなぁ
じゃmanサーバ立てて都度読みに行けば?
0768名無しさん@お腹いっぱい。
2006/03/17(金) 11:22:58けち臭いこというなw
0769名無しさん@お腹いっぱい。
2006/03/17(金) 11:45:580770名無しさん@お腹いっぱい。
2006/03/17(金) 11:55:43find / -type f -atime +365 -exec rm -f {} \;
でも実行しとけ
0771名無しさん@お腹いっぱい。
2006/03/17(金) 12:07:54多数のマシンに pkgadd して回るなんて面倒なことはできない。
デフォで入らなかったというのはそれはそれで意味があるのだろうし、
あえてデフォの状態をいじりたくないというのもある。
0772名無しさん@お腹いっぱい。
2006/03/17(金) 12:10:40それをシェルスレで主張する意味がわからん。
0773名無しさん@お腹いっぱい。
2006/03/17(金) 12:10:480774名無しさん@お腹いっぱい。
2006/03/17(金) 12:13:170775名無しさん@お腹いっぱい。
2006/03/17(金) 12:30:59そうだよ、入れなきゃいいんだよ。
オレは入れるなとは主張していない。
「manくらい入れろ」と言ってる >>762 とかに
反論してるだけ。
0776名無しさん@お腹いっぱい。
2006/03/17(金) 12:45:430777名無しさん@お腹いっぱい。
2006/03/17(金) 13:01:09このスレで質問したことは一度もない。
回答は多数。
初心者の質問に、誰かが man嫁と回答してるのを見て、
その直後にもっとずばりの回答をしてるのがオレ。
manなんかで回答するんじゃないぞ。
0778名無しさん@お腹いっぱい。
2006/03/17(金) 13:29:250779名無しさん@お腹いっぱい。
2006/03/17(金) 13:30:420780名無しさん@お腹いっぱい。
2006/03/17(金) 13:31:280781名無しさん@お腹いっぱい。
2006/03/17(金) 13:51:050782名無しさん@お腹いっぱい。
2006/03/17(金) 13:58:49> 初心者の質問に、誰かが man嫁と回答してるのを見て、
> その直後にもっとずばりの回答をしてるのがオレ。
質問者が調べる機会を奪っちゃいかんよ。
0783名無しさん@お腹いっぱい。
2006/03/17(金) 14:25:41でもオマエmanの入れ方解らないで教えてもらったじゃん
0784名無しさん@お腹いっぱい。
2006/03/17(金) 16:11:110785名無しさん@お腹いっぱい。
2006/03/17(金) 17:15:070786名無しさん@お腹いっぱい。
2006/03/17(金) 21:56:29どのようにして、その先入観を打ち破る事が出来るのか。本当に悩ましい
0787名無しさん@お腹いっぱい。
2006/03/17(金) 22:14:27そのネタもう古い。もっと新しいの頼む。
0788名無しさん@お腹いっぱい。
2006/03/17(金) 23:57:090789名無しさん@お腹いっぱい。
2006/03/18(土) 00:07:220790名無しさん@お腹いっぱい。
2006/03/18(土) 00:18:150791名無しさん@お腹いっぱい。
2006/03/18(土) 12:04:50man入れるか入れないかは別として回答としては>>701が一番良いと思うけどな。
>>699の人はある程度調べた後に質問したように見えるし、調べる方向が間違いつつあるようにも見える。
そういう人にはそのものずばりの回答を出せば、その人は自分で man date で回答を確かめる事をすると
思うよ。
0792名無しさん@お腹いっぱい。
2006/03/18(土) 12:28:56だから?
要するに君はここが相変わらずレベル低いと言いたかったわけだね
0793名無しさん@お腹いっぱい。
2006/03/18(土) 13:22:42ジサジエも飽きたから何か変わったUNIXを振ってくれよ
0795名無しさん@お腹いっぱい。
2006/03/18(土) 13:39:280796名無しさん@お腹いっぱい。
2006/03/18(土) 14:01:41#!/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:360798名無しさん@お腹いっぱい。
2006/03/18(土) 14:13:130799名無しさん@お腹いっぱい。
2006/03/18(土) 14:37:08ありがとうございます。
早速実行してみましたが、
53歳だと、dateの実行のところでエラーになって
16歳に戻れません。
53歳以上にも対応したUNIXを打つ方法はありませんか?
■ このスレッドは過去ログ倉庫に格納されています