シェルスクリプト総合 その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 でトレースしましょう。
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を打つ方法はありませんか?
0801名無しさん@お腹いっぱい。
2006/03/18(土) 14:47:10典型的な自作自演の告白乙
ココではそんなお約束は書かなくてもおk
0802名無しさん@お腹いっぱい。
2006/03/18(土) 21:09:36俺は801では無い。
manは入れてない。
いつもずっぽり。
0803名無しさん@お腹いっぱい。
2006/03/18(土) 21:18:06これを、coding system = euc に変更したいので、
hexでエンコードされた「:」入りの日本語ファイル名をすべて
EUCに変換したいのですが、
どういうシェルを書いて、どういうUNIXを打てばいいでしょうか?
0804名無しさん@お腹いっぱい。
2006/03/18(土) 22:07:30http://www.samba.gr.jp/project/contrib/smbchartool.html
0805名無しさん@お腹いっぱい。
2006/03/18(土) 22:23:41それ、、、以前使ったら、シンボリックリンクも全部おいかけられて、
1つのファイル名を何度も何度もコード変換されて、全部の日本語
ファイルが化け化けになったw
0806名無しさん@お腹いっぱい。
2006/03/18(土) 23:07:48http://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:32findの -execのところに ` ` 書いても期待通りに動作しないと思うぞ。
0808名無しさん@お腹いっぱい。
2006/03/18(土) 23:59:270809名無しさん@お腹いっぱい。
2006/03/19(日) 00:18:50うーん、795の意図を正確に処理したら、
子プロセスがたくさん出来て困るんですけど。
0810名無しさん@お腹いっぱい。
2006/03/19(日) 01:37:00実行されたらあるディレクトリがあるか調べて
そのディレクトリが存在していれば○○
存在していなければ停止
このようなシェルスクリプトはどう書けばいいのでしょうか?
できればbashとshの両方が知りたいです
0811名無しさん@お腹いっぱい。
2006/03/19(日) 01:47:49man test
0812名無しさん@お腹いっぱい。
2006/03/19(日) 04:34:39if [ -d あるディレクトリ ]
then
○○
else
停止
fi
0813名無しさん@お腹いっぱい。
2006/03/19(日) 06:04:35A = 'ps ax | grep あるディレクトリ | wc -l'
if [ $A ]; then
○○
else
停止
fi
0814名無しさん@お腹いっぱい。
2006/03/19(日) 06:05:20A = 'ls | grep あるディレクトリ | wc -l'
if [ $A ]; then
○○
else
停止
fi
0815名無しさん@お腹いっぱい。
2006/03/19(日) 09:02:40何がしたいんだ? >>812の正解のあとで間違った答えを出して
0816名無しさん@お腹いっぱい。
2006/03/19(日) 09:26:290817名無しさん@お腹いっぱい。
2006/03/19(日) 09:26:39君も man test
0818名無しさん@お腹いっぱい。
2006/03/19(日) 09:32:34>>812 正解。
>>813-814 初心者かな? >>812 の正解を参照汁。
それだとディレクトリがなくても wc -l の結果の 0 が Aに入るので、
ifで常に結果が真になる。grepでの判定も曖昧。
そんなことしなくても [ -d hoge ] でできることを覚えろ。
0819名無しさん@お腹いっぱい。
2006/03/19(日) 09:34:42おまえら一生manだけ読んでろ。manを読むばかりで手を動かさない机上の空論者だな。
0820名無しさん@お腹いっぱい。
2006/03/19(日) 09:40:23はぁ?
>>806 はfind実行する前に ` `が展開されるよ。
しかも、find の -exec のあとは直接のコマンドであって、
シェルスクリプトではないため、
-execの実行時には一切のシェルの解釈を受け付けない。
だから、仮に ` ` がfindの実行前に展開されていないとすると、
逆に -exec の時に ` ` がエラーになる。
いずれにしても、>>806 は大間違い。
俺は正解を知ってるが、回答者バトルのために敢えて書かない。
わかるモン居たら書いてみろ。
0821名無しさん@お腹いっぱい。
2006/03/19(日) 09:50:160822名無しさん@お腹いっぱい。
2006/03/19(日) 10:45:01熱くなりすぎ。>>808は>>807への突っ込みだと取ったんだが。
0823名無しさん@お腹いっぱい。
2006/03/19(日) 13:05:49それに突っ込んでる >>808 は間違い。
おおもとの >>806 が間違いなのは言うまでもないが。
0824名無しさん@お腹いっぱい。
2006/03/20(月) 12:00:36私英語苦手・・・・じゃなくて、日本語苦手。
0825名無しさん@お腹いっぱい。
2006/03/20(月) 14:43:210826名無しさん@お腹いっぱい。
2006/03/20(月) 16:27:410827名無しさん@お腹いっぱい。
2006/03/20(月) 16:36:01アンカー先間違えてる?
818にそう言っても話が繋がらないのだが・・
0828名無しさん@お腹いっぱい。
2006/03/20(月) 16:51:18■ このスレッドは過去ログ倉庫に格納されています