トップページ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 でトレースしましょう。
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が振られましたのでよろしく。
0801名無しさん@お腹いっぱい。2006/03/18(土) 14:47:10
>>794
典型的な自作自演の告白乙
ココではそんなお約束は書かなくてもおk
0802名無しさん@お腹いっぱい。2006/03/18(土) 21:09:36
よしきた、俺にまかせろ!
俺は801では無い。
manは入れてない。
いつもずっぽり。
0803名無しさん@お腹いっぱい。2006/03/18(土) 21:18:06
Sambaで coding system = hex で運用されていたサーバーがあります。
これを、coding system = euc に変更したいので、
hexでエンコードされた「:」入りの日本語ファイル名をすべて
EUCに変換したいのですが、
どういうシェルを書いて、どういうUNIXを打てばいいでしょうか?
0804名無しさん@お腹いっぱい。2006/03/18(土) 22:07:30
書かんでよい。よってスレ違い。
http://www.samba.gr.jp/project/contrib/smbchartool.html
0805名無しさん@お腹いっぱい。2006/03/18(土) 22:23:41
>804
それ、、、以前使ったら、シンボリックリンクも全部おいかけられて、
1つのファイル名を何度も何度もコード変換されて、全部の日本語
ファイルが化け化けになったw
0806名無しさん@お腹いっぱい。2006/03/18(土) 23:07:48
じゃあ、
http://ftp.yz.yamagata-u.ac.jp/pub/network/samba-jp/tool/smbjcode/
のsmbjconv.plで、
find . -type f -exec mv {} `echo {} | /tmp/ss/smbjconv.pl hex euc` \;
0807名無しさん@お腹いっぱい。2006/03/18(土) 23:14:32
>>806
findの -execのところに ` ` 書いても期待通りに動作しないと思うぞ。
0808名無しさん@お腹いっぱい。2006/03/18(土) 23:59:27
find実行される前に展開されんだろ
0809名無しさん@お腹いっぱい。2006/03/19(日) 00:18:50
>>798
うーん、795の意図を正確に処理したら、
子プロセスがたくさん出来て困るんですけど。
0810名無しさん@お腹いっぱい。2006/03/19(日) 01:37:00
すいませんが、お力を貸してください
実行されたらあるディレクトリがあるか調べて
そのディレクトリが存在していれば○○
存在していなければ停止

このようなシェルスクリプトはどう書けばいいのでしょうか?
できればbashとshの両方が知りたいです
0811名無しさん@お腹いっぱい。2006/03/19(日) 01:47:49
>>810
man test
0812名無しさん@お腹いっぱい。2006/03/19(日) 04:34:39
>>810

if [ -d あるディレクトリ ]
then
○○
else
停止
fi
0813名無しさん@お腹いっぱい。2006/03/19(日) 06:04:35
>>810

A = 'ps ax | grep あるディレクトリ | wc -l'

if [ $A ]; then
○○
else
停止
fi
0814名無しさん@お腹いっぱい。2006/03/19(日) 06:05:20
>>810街がえっタ

A = 'ls | grep あるディレクトリ | wc -l'

if [ $A ]; then
○○
else
停止
fi
0815名無しさん@お腹いっぱい。2006/03/19(日) 09:02:40
>>813-814
何がしたいんだ? >>812の正解のあとで間違った答えを出して
0816名無しさん@お腹いっぱい。2006/03/19(日) 09:26:29
で、>>806 だと不正解なわけだが、誰も正解はわからないのかな?
0817名無しさん@お腹いっぱい。2006/03/19(日) 09:26:39
>>813
君も man test
0818名無しさん@お腹いっぱい。2006/03/19(日) 09:32:34
>>811 man で回答するのヤメレ。

>>812 正解。

>>813-814 初心者かな? >>812 の正解を参照汁。
それだとディレクトリがなくても wc -l の結果の 0 が Aに入るので、
ifで常に結果が真になる。grepでの判定も曖昧。
そんなことしなくても [ -d hoge ] でできることを覚えろ。
0819名無しさん@お腹いっぱい。2006/03/19(日) 09:34:42
>>811,817
おまえら一生manだけ読んでろ。manを読むばかりで手を動かさない机上の空論者だな。
■ このスレッドは過去ログ倉庫に格納されています