トップページ⇒linux
988コメント336KB

シェルスクリプト総合@LINUX Part3

■ このスレッドは過去ログ倉庫に格納されています
0001login:Penguin2007/07/10(火) 23:17:13ID:qGthZdME
UNIX板のスレを見ている方も多数おられるかと思いますが、
まあそれはそれとして、BASHウゼーとか言われる心配なく
平和にLINUX的スクリプト談義しましょうよ。

初めての自作スクリプト、自信ないから見てください。な初心者から
トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで
いろいろな人に参加して頂けると嬉しいです。

perlやらPythonやらの話が混ざっても良いんでない?

【sed】シェルスクリプト総合@LINUX Part2【awk】
http://pc11.2ch.net/test/read.cgi/linux/1154578200/
http://pc8.2ch.net/test/read.cgi/linux/1121994321/

>>2-5あたりに色々と。
0367login:Penguin2007/12/03(月) 17:31:20ID:BNt6sl0D
>>366
画像が表示されないのは、送ってくるContent-Typeがおかしいのか。
なんでapplication/octet-streamやねん。
0368login:Penguin2007/12/04(火) 22:59:48ID:Bpu7L1AF
ややスレ違いだが、くだ質よりこっちかなと

シェルスクリプトの本を買う際に、Linuxユーザーでbashメインで使ってるなら
主旨がbash向けのものを買うべきですか?
それともB shell全般向けやsh向けでbashは補完程度の本でも質の高いものを買うべきでしょうか
両シェルの間にそれほど機能、性格の差はなさそうだし
0369login:Penguin2007/12/04(火) 23:06:21ID:0gQg9Z1k
bashismって言葉があるくらいで、ついついbashの機能を使ってしまうことは多い。
素のBourne Shellの機能がどこまでなのか書いてある本がいいと思う。
0370login:Penguin2007/12/04(火) 23:28:47ID:Bpu7L1AF
>>369
サンクス
sh向けでも最近の多くの書籍はbashもカバーしているようですので、その辺りを探してみます
0371login:Penguin2007/12/05(水) 11:12:29ID:tDVDuECI
ttp://www.amazon.co.jp/dp/4774122610
そのへん意識するならこれいいかも。
SunOS の bsh と FreeBSD の bsh ( ash ) で違いがある場合についてまで
明記されてる。
0372login:Penguin2007/12/05(水) 21:59:53ID:KlliiKVC
>>371
その本と、「UNIXシェルスクリプトコマンドブック 山下 哲典」を最後に候補にしてましたが、後者を買いました。
sh、bash共用でサンプルが多いので。
0373login:Penguin2007/12/06(木) 18:06:51ID:ltYfbiEn
いつも複合条件式でまるんですけど
#!/bin/bash
WAITSEC=""
if [ -z "$WAITSEC" -o $WAITSEC -lt 60 ]; then
    WAITSEC=10
fi
を実行すると
./hoge.sh: line 3: [: too many arguments
というエラーになります。-oとか-aで記述するifは今まで何回かやったのに
一度もできた記憶が無い!!。結局ifを分けたりして対処してきた負け人生です。

いったい何が悪いというのでしょうか??
教えていただけますか?
0374login:Penguin2007/12/06(木) 18:31:24ID:bgO18Eza
確かにbashだとなるねぇ。zshだとならんから気づかなかったw

#!/bin/bash
WAITSEC=$1
if [ -z "$WAITSEC" ] || [ $WAITSEC -lt 60 ]; then
WAITSEC=10
fi

echo $WAITSEC

とりあえずこれで。
0375login:Penguin2007/12/06(木) 18:35:40ID:bgO18Eza
と、思ったら出来たw
if [ -z "$WAITSEC" -o \( $WAITSEC -lt 60 \) ]; then

こういうことだな。
優先順位がおかしいんだ。
0376login:Penguin2007/12/07(金) 00:20:04ID:2WlU8Mqa
>>373
-z "$WAITSEC" の成否にかかわらず $WAITSEC -lt 60が実行されちゃってるから問題なんじゃないか?
おそらく -z "$WAITSEC"のときは 後ろの条件は 「-lt 60」になるだろうから、>>374のようにするか${WAITSEC:-0}とかやったらいいんじゃね?
0377login:Penguin2007/12/07(金) 10:01:03ID:uKkYmJTB
>WAITSEC=""
なので、
>if [ -z "$WAITSEC" -o $WAITSEC -lt 60 ]; then
は
if [ -z "" -o -lt 60 ]; then
と解釈されてエラー。
zsh は sh と違って $WAITSEC は "$WAITSEC" と同じ意味なのでエラーにならない。

"$WAITSEC" -lt 60 と書き換えた場合は、

>-z "$WAITSEC" の成否にかかわらず $WAITSEC -lt 60が実行されちゃってるから問題なんじゃないか?

この理由で正しい。
0378login:Penguin2007/12/11(火) 22:53:04ID:8t30b6aC
シェルスクリプトにコメントを書くには
# comment

っていう感じに # を行頭につけてコメントにしますが、自作のシェルスクリプト等に
日本語でコメントを埋め込むのは良くない事なのでしょうか?
英語でコメントを埋め込むべきなのでしょうか?

理由>環境によっては文字化けするかもしれないから

その場合、英語では上手くコメントがかけないのですが、、、皆さんはこの辺どうしていますか?
0379login:Penguin2007/12/11(火) 23:22:06ID:8VUAk6YG
>>378
英語では上手くコメントがかけない、って、自分が書いた自分用のスクリプトだったら、
べつに、自分にさえ分かればいいんじゃないの?極端な話、ローマ字で書いた日本語でもいいんじゃないかと。
0380login:Penguin2007/12/11(火) 23:27:45ID:LcSZkVoI
Shift_JISで書いて2バイト目に ¥ が含まれるとコメントが継続しちまうかな、
と思ったんだが、そうでもないみたいだな。
0381login:Penguin2007/12/12(水) 08:33:10ID:itajSrlG
>>379
いやー、他の人にもスクリプトの内容が分かるようにコメント書かないといけない場合はどうすれば?
今はローマ字で書いたりしていますが、さすがに見にくいというか・・・ かといって英語では上手くかけないし・・
C言語やJava等では // 日本語コメント が使えるし
MS-DOSの.batファイルでも
REM 日本語コメント
が使える、Windows Script Hosting(WSH)であっても
'日本語コメント
が使えて、大抵のスクリプト言語は日本語のコメントが使えるのになぜにLinuxのシェルスクリプト
だけこんな事で悩まないといけないんだろうと・・・。
まぁOSが違うから文字コード周りのトラブルなんだろうけど・・。
0382login:Penguin2007/12/12(水) 09:12:34ID:fnWAKO+5
使えるか使えないかっていうなら使えるだろ。
確実に自分しか使わないならShift_JISのようなbrain damagedな文字コードじゃなきゃ
別に何でもいいんじゃない。
しかし使ってよいか使わざるべきかというと、一般にスクリプトって
どのロケールで実行されるかわからないよとかの問題が出てくる。
あなたが出した例ではCやJavaのソースファイルはコンパイルするときの
環境が限定できれば問題ないし、DOSのバッチファイルも日本語DOSしか
考えていない。
0383login:Penguin2007/12/12(水) 11:25:06ID:ytRjAEEx
>Shift_JISで書いて2バイト目に ▼ が含まれるとコメントが継続しちまうかな、

sjis だろうが何だろうがコメントの継続なんてありません。

>しかし使ってよいか使わざるべきかというと、一般にスクリプトって
>どのロケールで実行されるかわからないよとかの問題が出てくる。

コメントにロケールなんて関係ありません。
0384login:Penguin2007/12/12(水) 11:32:57ID:11rQvfIz
英語くらい書けよ。
0385login:Penguin2007/12/12(水) 12:33:25ID:5zz/Y7Bm
っつか、どういう環境(=人間環境)だか知らないけど、
そんな雰囲気だと、頑張って英語でコメントを書いても、
肝心の「他の人」が、それを理解出来ない、
ということが容易に想像出来てしまうわけで、
だったらローマ字でいいじゃん、と思う。
0386login:Penguin2007/12/15(土) 11:57:10ID:FOfJjZuV
>>383
コメントってのは実行されるときはロケール関係ないけど
元々読むものだから、ロケールばらばらと読みにくくて困るよね
って意味だよ。たぶんね。
0387login:Penguin2007/12/19(水) 22:19:06ID:qeHYVBDH
#!/bin/bash
for i in *.txt
で、'*.txt' で展開されるリストの長さに制限はある?

ls: argument list too long になる長さでも処理できるようだが、他に何か別の制限はある?
0388login:Penguin2007/12/20(木) 18:50:14ID:Qtkk7tpx
sedについての質問です

aaa
bbb
ccc

という出力を、sedコマンドで一行にしたいのです。
aaa bbb ccc このように。
どうしたらよいですか。

逆の、sed -e 's/\ /\n/g' はできるのですが。
0389login:Penguin2007/12/20(木) 21:20:24ID:1r8qT2Sh
awkなら
$ (出力するコマンド) | awk '{printf("%s ", $0)}'
でできるんだけどなぁ
0390login:Penguin2007/12/20(木) 21:47:48ID:p9kMPhFx
$ cat input
aaa
bbb
ccc
$ sed -n 'H;${g;s/¥n/ /g;s/^ //p;}' input

なんか無様だ。きっともっとスマートに出来るに違いない。
0391login:Penguin2007/12/20(木) 21:49:27ID:p9kMPhFx
もし各行が空白文字を含まないなら、
echo `cat 元テキスト` > 新テキスト
でいいな。

0392login:Penguin2007/12/20(木) 22:14:22ID:IRXLh3Ok
>>388
sed ':loop; N; s/\n/\ /g ;$!b loop' hoge
0393login:Penguin2007/12/20(木) 22:19:20ID:UDgG5/dT
sedにこだわらなければ
tr -s '\n' ' ' < input
とか
0394login:Penguin2007/12/20(木) 22:28:20ID:p9kMPhFx
目的によっては、
$ fmt input

fmtってUNIX標準?
0395login:Penguin2007/12/20(木) 22:39:06ID:Qtkk7tpx
>>389-393
こんなにレスが来るとは。
皆さんありがとうございます。

すべて試してすべてで出来ました。
echoとtrはなるほどという感じです。
他は知りませんでした。レベル1アップですね。
0396login:Penguin2007/12/20(木) 22:43:02ID:Qtkk7tpx
>>394
更新遅れた。
できました。オプションすらいらないとは。
0397login:Penguin2008/01/06(日) 19:04:19ID:tfZRITK8
awkで
awk '{print $2,$3}' とすると2,3番目が表示されますが
二番目以降全て表示するにはどうすればいいのでしょうか?
0398login:Penguin2008/01/06(日) 19:44:21ID:TN85yzo6
awk 'gsub($1,"")'
0399login:Penguin2008/01/06(日) 21:41:07ID:HrtO6pOF
$1に特殊文字が入れられると思わぬ結果になりそうな気がする。
0400login:Penguin2008/01/06(日) 21:53:19ID:xjxCtnUs
awk '{for (i=2;i<=NF;i++){printf($i" ")}}'
0401login:Penguin2008/01/06(日) 22:56:50ID:HrtO6pOF
フィールド区切が複数のスペースやタブコードでも、1個のスペースに置換されてしまう気がする。
>>397の「全て」がそこまで求めているかは分からないが。
0402login:Penguin2008/01/07(月) 00:59:34ID:Lq+3ioDo
>>401
awk -Fなにか  '{for (i=2;i<NF;i++){printf("%s%s", $i, FS)};print $NF}'
04033972008/01/07(月) 02:29:17ID:SZZlXYY6
ありがとうございます。
最初 >>387 さんと同じことを思ったのですが他に
オプションか何かで用意されていると思ってました。
402さんのを使わせていただきます
04043972008/01/07(月) 02:29:58ID:SZZlXYY6
s/387/398
0405login:Penguin2008/01/07(月) 17:21:59ID:CzyB4/IB
>>402
これだと複数の空白が一つになって表示される

0406login:Penguin2008/01/07(月) 18:30:26ID:DBTZ8VT2
awk '{gsub($1, "");print substr($0,2)}'
0407login:Penguin2008/01/07(月) 18:59:30ID:AGg2gknU
hint:
aho,choaho,kusoaho,doaho
∴
awk '{print substr($0,length($1)+2)}'

0408login:Penguin2008/01/07(月) 20:07:07ID:81ckgAQ5
個人的には>>398をアレンジして、
gawk 'gsub(/^[[:blank:]]*[^[:blank:]]+/,"")'
かな。
0409login:Penguin2008/01/07(月) 20:13:04ID:DBTZ8VT2
なんだ>>398で既出だったのね。見落としスマソ。
0410login:Penguin2008/01/07(月) 23:07:24ID:6d+dex8H
[file1]
bar=234

[file2]
foo=123
Bar=987

と2つのkey=valueな内容が入ってるファイルがある。ここで、file1には
ないがfile2にはあるkeyのみ(case-insensitiveな比較で、また、valueは
違っていてよい)を拾いkey=valueを出力したいのだけど、一行で書けないかな?

どういう出力になってほしいかというと

 $ myuniq --split-char='=' --field-index=1 --print-unique file1 file2
 foo=123

というような実行イメージ。awkで

awk -F= '{ line[toupper($1)]=$0; seen[toupper($1)]++; } END { for (key in line) if (seen[key] == 1) print line[key]; }' file1 file2

みたいなのはでっち上げたんだけど、正直汚い。
0411login:Penguin2008/01/07(月) 23:30:18ID:6RYIn4eu
回答じゃなくてすまんのだが、最後にあるワンライナーだと、
2ファイル通して1回しか現れなかったものを表示するから、
「file1にはないがfile2にある」ものだけでなく
「file2にはないがfile1にある」も出てこないか?
0412login:Penguin2008/01/07(月) 23:35:18ID:6RYIn4eu
負けず劣らずかっこ悪いシロモノ

for w in `cut -d= -f1 file1 file2 |tr A-Z a-z|sort|uniq -c|sed -n 's/ 1 *//p'`; do grep "^$w=" file2; done
0413login:Penguin2008/01/07(月) 23:52:40ID:DBTZ8VT2
grep -v -i "`cut -d= -f1 file1`" file2

重複は無考慮
0414login:Penguin2008/01/07(月) 23:54:29ID:6d+dex8H
>>411
あ、すみません。バグです。が、元の仕様が厳しすぎで、

 どちらかにしかないエントリを出す

でも大丈夫でした。

 file1かfile2のどちらかにのみあるkeyに対応するkey=valueを出力する

に仕様を訂正させてください。

何をしたいのかというと、Windowsの環境変数を手元のUNIXな環境に
取り込みたいのですが、その際に自分で定義している分については
上書きされないようにしたいのです。

hostA$ env > hostA.env
hostB$ env > hostB.env
hostB$ myuniq ... hostA.env hostB.env > diff.env
hostB$ . ./diff.env

みたいなことをしたいと。で、片方の環境が Windows なもので、
case insensitiveな比較とかも必要になってます。

行全体ではなく特定のフィールドのみ見て uniq/diff 処理して出力って
簡単そうで微妙に面倒です。
0415login:Penguin2008/01/07(月) 23:59:58ID:6d+dex8H
>>413
おおー。grepのexprに改行入れるとそんな動作になるとは!
エレガントです。勉強になりました mOm
0416login:Penguin2008/01/08(火) 18:35:59ID:0P1F18Bp
1行で2つのコマンドを実行するときに
2つ目に実行したコマンドに、1つ目に実行したコマンドの引数を
そのまま渡したい場合の記述方法がわからず、困っています。

$ vi hogehoge; echo ??
*??が不明箇所*

上記の例の場合は2つ目に実行しているecho文の出力結果でhogehogeを表示させたいのですが。。
対処方法はないでしょうか?
よろしくお願いいたします。
0417login:Penguin2008/01/08(火) 18:38:30ID:k6k1za9N
>>416
i="hogehoge"; vi $i; echo $i
じゃだめなん?
04184162008/01/08(火) 19:34:39ID:0P1F18Bp
>>417
ありがとうございます。
その方法があったことに気づきませんでした。
おかげで解決しました、感謝です><
0419login:Penguin2008/01/08(火) 23:12:30ID:OqUgF6yk
vi hogehoge; echo !$
0420login:Penguin2008/01/08(火) 23:26:00ID:5sg6/WvN
>>419
それタイプしたタイミングではまだ!$は前行のコマンドの。
0421login:Penguin2008/01/08(火) 23:33:15ID:A2IkwjEN
引数が一つだけなら

vi hogehoge; echo $_

でもいけるな。
0422login:Penguin2008/01/10(木) 13:02:51ID:9dVYtTPe
cshからJavaを呼び出すシェルを作成しています。

その呼び出したJava内部で例外が発生した場合、
以降のシェルの処理を続行させたくありません。

どの様にすればよいのですか?
Javaのcatch節でSystem.exit(1);とかで処理を終了させて、
cshでそれを検知する方法があるのかなぁ?
と漠然には思うのですが・・・
0423login:Penguin2008/01/10(木) 19:51:46ID:qThypT9T
>>422
System.exitが何をするのか分かっているなら、
Javaコマンドの終了値を普通にifなりswitchなりで受けて、csh側からもexitすれば良いだけでは?
単純に例外=即終了と決め打ちなら良いけど、例外によって複数の処理をさせたくなると、
System.exitの終了値を多数用意して管理しなければならなくなって面倒だけどね

ここからはポリシーの問題になるけど、System.exit等を使ってコマンドの終了値を利用するよりは、
どんな例外で終了したのかを前もって文字列等でstderrにでも吐き出したり、
終了した例外を表すような長さゼロのテンポラリファイルでも作ってから、Javaコマンドの方を終了させておいて、
csh側からは、むしろその文字列やファイル名を評価させてexitさせるようにした方が、後からデバッグする時とかは楽だよ

更に言えばシェルプログラミングにcshを使うのは止めるべき
http://www.klab.ee.utsunomiya-u.ac.jp/~hiroki/csh-whynot.euc
http://www.klab.ee.utsunomiya-u.ac.jp/~hiroki/sh-perl-tips/
0424login:Penguin2008/01/10(木) 21:50:31ID:CJRDs9Ag
Javaのポリシーは知らないが、エラーメッセージと終了コードは二者択一せにゃならんものではない気がする。
0425login:Penguin2008/01/11(金) 14:14:06ID:mrGJLB/g
>>423、424
ありがとうございます。

シェルスクリプト自体、経験が浅い上に今回の要望がcshというのが
決まっているもので・・・
困っています。。。
2chでの質問自体も初めてなもので・・・

準正常として扱うような例外は全てJava側で処理をしてプログラムは
正常終了として扱っています。
処理続行不可能と判断した、ランタイム系やIO例外などが発生した場合は
後続のシェルを流したくない。
という状況です。



if $JAVA_CMD
then
続き
else
exit 1
fi

以下処理続く
・・・
ってな感じにしたのですが、どうも上手くJavaでexitした値が取れないです。
文法が間違っているのですかね?
もう少し調査してみますが、上記の書き方で間違いがあればご指摘頂きたいです。

後は教えていただいた、テンポラリファイルでの判断も考えてみます。
0426login:Penguin2008/01/11(金) 15:11:54ID:GLHvzQDj
findコマンドの結果をツリービュー(treeコマンドの結果的なツリー表示)で出すコマンドまたは方法ってありますか?
0427login:Penguin2008/01/11(金) 16:08:44ID:6CIbL1kG
>>425
cshなら

$JAVA_CMD
if ($? != 0) then
  echo "failed"
  exit $?
endif

echo "OK"

でどう?
0428login:Penguin2008/01/11(金) 16:55:30ID:mrGJLB/g
>>427
ありがとうございます。
教えていただいた方法で、想定通りの動作になりました。
0429login:Penguin2008/01/11(金) 21:11:49ID:OPXAXUzh
>>426
普通にtreeコマンド使うんじゃだめなん??
findで絞った結果を出したいのかなぁ。
0430login:Penguin2008/01/11(金) 22:17:07ID:4hqMEkJ5
grep -f find結果 tree結果
とか。

# 本気にしないように。
0431login:Penguin2008/01/11(金) 23:02:21ID:aloediIm
基本的にはtree | grep なんちゃら でいいんじゃね?
0432login:Penguin2008/01/14(月) 11:50:49ID:3iR1bkH0
画像の特定の領域だけを一括でぼかしたいのですが
いい方法はありませんか?
0433login:Penguin2008/01/14(月) 12:00:15ID:ZjONjaHo
つ netpbm

0434login:Penguin2008/01/14(月) 12:12:55ID:6n5zEajJ
つimagemagick
0435login:Penguin2008/01/14(月) 14:01:26ID:Or9vH7Fn
メールアドレスの@以降の最後の国を表すCountry Codeの部分だけを抜き出すには
どのような正規表現を使えば良いでしょうか?

@hotmail.co.jp の.jp の部分を見る感じです。
.jp以外は無視する、という感じです。これで日本のメールしか相手にしない事になりますよね。
0436login:Penguin2008/01/14(月) 14:04:07ID:ZjONjaHo
spam避け?

日本からも.comや.netや.orgや.infoや.bizや.acや.tvや.toや(以下略)の
アドレスでメールが送られることはあるぞ。
0437login:Penguin2008/01/14(月) 14:04:25ID:Or9vH7Fn
$.jp

↑これでいいんでしょうか?正規表現全く知らない状態でネットでちょっと検索してみたのですが・・・
0438login:Penguin2008/01/14(月) 14:05:05ID:Or9vH7Fn
あっちゃー、そうなんですか・・・
海外のメールを相手にしない方法って無いんですかね・・・
英語でViagraとかうるさいんですよ。
0439login:Penguin2008/01/14(月) 14:17:08ID:6n5zEajJ
/[あ-ん]/?
ひらがながないメールは無視してもよかろう。
0440login:Penguin2008/01/14(月) 14:37:34ID:FCIPzPAY
ヘッダの Content-Type を見て弾くとかどうよ?

^Content-Type: .*iso-2022-jp
0441login:Penguin2008/01/14(月) 14:42:36ID:6n5zEajJ
最近はutf-8なのも多いよ。
0442login:Penguin2008/01/14(月) 14:54:07ID:JtG94m55
utf-8 は違法で、危険運転致死罪が適用になるんじゃ?
0443login:Penguin2008/01/14(月) 22:54:28ID:RfE0b+o0
>>437
\.jp$

では?
0444login:Penguin2008/01/16(水) 13:17:12ID:ZRO/FTzi
テキストファイルを、最後の3行を除いて出力したいのですが
何か良い書き方はないでしょうか。
sed '$d' xxxx | sed '$d' | sed '$d' と書くくらいしか思い付かなくて。
0445login:Penguin2008/01/16(水) 14:26:14ID:1obpvu1A
>>444
head -n -3 foobar.txt
0446login:Penguin2008/01/16(水) 17:01:38ID:IKqjky5V
awk '{a[NR]=$0}END{for(j=1;j<=NR-3;j++) print a[j]}' a.txt
0447login:Penguin2008/01/16(水) 18:25:12ID:ZRO/FTzi
>>445
head のオプションは見落としてました…ありがとうございます
0448login:Penguin2008/01/16(水) 21:56:01ID:KAlEWwYc
ランダムな数字が欲しいとき,どうするのが簡単?
1. $$
2. $RANDOM
3. /dev/urandom
4. 時計
あたりを思いついたんだけど
0449login:Penguin2008/01/16(水) 22:14:57ID:yh54UVVr
ワシは、ランダムな数字の用途により生成手段を変えてるような気がする。
0450login:Penguin2008/01/16(水) 22:16:21ID:KAlEWwYc
1. 偏りそう
2. bash依存
3.4. 面倒
という問題点があるから,誰かいい方法教えてくれないか?
0451login:Penguin2008/01/16(水) 22:19:14ID:KAlEWwYc
>449 たしかに用途によって求められる強さが違う気がする.
とりあえずこうしとけ的な汎用的な方法はないんかな.
いちばん手軽な方法が知りたい
0452login:Penguin2008/01/16(水) 22:47:32ID:HQvmxN1E
>>448

$$はスクリプト内で複数個必要だと使えない罠
dateのmanを見ていたら、

 %N nanoseconds (000000000..999999999)

というのがあった。こんな感じ

% echo -n `date +%N`
431218994 % echo -n `date +%N`
857494685 % echo -n `date +%N`
269031777 % echo -n `date +%N`
803351248 % echo -n `date +%N`
195538275 % echo -n `date +%N`
538357509 % echo -n `date +%N`
058776188 %
0453login:Penguin2008/01/16(水) 23:09:59ID:PJonPFmQ
jotはたぶんBSD系限定だよな。
jot -r 10 1 6


/dev/urandomは10進数テキストで得るのがめんどーだろうか。
dd if=/dev/urandom bs=2 count=1 2>/dev/null | od -vd

左カラムがじゃまだな。 sed 1q |cut -f2 -d' ' とかで削るか。


0454login:Penguin2008/01/16(水) 23:21:36ID:KAlEWwYc
>452,453
なるほど.date +%Nはいい感じ.
jot便利そうだよ,jot.犬にもこんなの欲しいな.
ありがとう
0455login:Penguin2008/01/16(水) 23:24:18ID:HQvmxN1E
od -t u1 /dev/urandom | awk '{print $2;exit}'
0456login:Penguin2008/01/16(水) 23:33:28ID:PJonPFmQ
r=`fortune | md5sum - | sed 's/^¥(........¥).*/¥1/'`
r=`printf %d 0x$r`

ごめんなさいごめんなさい。
0457login:Penguin2008/01/16(水) 23:51:47ID:puzD1M+G
普通に perl -e 'print int(rand(1000))' じゃダメなの?(perl5前提だけど)

0458login:Penguin2008/01/16(水) 23:55:16ID:KAlEWwYc
>457 これだけのためにperlやawkを出してきたくないという貧乏心があってwww
0459login:Penguin2008/01/17(木) 01:30:17ID:xe77Y4ah
時は金なり、というじゃない
0460login:Penguin2008/01/17(木) 01:45:37ID:hGbWYs9C
つーか、乱数ってこれだけのため、っていうほど簡単なものじゃないと思う。
そういうものが必要な処理はシェルじゃなく、ちゃんとそれなりの言語でプログラムしたほうがいいかも。
0461login:Penguin2008/01/17(木) 09:08:26ID:MJ2pzO6M
確かに簡単な乱数ならともかく、ちゃんとした乱数が欲しい処理は言語引っ張り出したほうが良いかもね
0462login:Penguin2008/01/17(木) 09:18:44ID:wcByJn9i
% i=0; while [ $i -lt 1000 ] ; do echo "$i "`date +%N`; i=`expr $i + 1`; done \
    | awk '{hist[int($2%10)]++} END{for (i in hist) {printf("%2d %5.2f%\n",i, hist[i]/NR*100) }; exit}' | sort -k1n
0 9.70%
1 10.70%
2 8.60%
3 11.00%
4 10.40%
5 8.90%
6 11.40%
7 9.70%
8 9.80%
9 9.80%
(´・ω・`)

% i=0; while [ $i -lt 1000 ] ; do echo "$i "`date +%N`; i=`expr $i + 1`; done \
    | awk '{hist[int($2%10)]++} END{for (i in hist) {printf("%2d %5.2f%\n",i, hist[i]/NR*100) }; exit}' | sort -k1n
0 9.20%
1 12.30%
2 8.60%
3 11.00%
4 11.20%
5 9.30%
6 11.40%
7 7.80%
8 11.40%
9 7.80%
(゚д゚)
0463login:Penguin2008/01/17(木) 09:28:02ID:wcByJn9i
% od -t u1 /dev/urandom \
    | awk '{hist[int($2/256.0*10)]++} NR==1000{for (i in hist) {printf("%2d %5.2f%\n",i, hist[i]/NR*100) }; exit}' | sort -k1n
0 9.80%
1 9.50%
2 10.10%
3 9.80%
4 9.80%
5 9.40%
6 10.20%
7 10.20%
8 10.30%
9 10.90%
(´・ω・`)


% perl -e '$MAX=10;$LOOP=1000000; for (1...$LOOP) {$hist[int(rand()*$MAX)]++}; for (0..$MAX-1) {printf("%2d %4.2f%\n", $_, $hist[$_]/$LOOP*100) }'
0 9.98%
1 9.99%
2 9.99%
3 10.02%
4 10.03%
5 10.02%
6 9.92%
7 10.00%
8 10.00%
9 10.04%
(゚∀゚)

date +%Nは、ばらつきはともかく遅いな...
0464login:Penguin2008/01/17(木) 10:59:36ID:bFGNQCBf
遅いのは date +%N じゃなくて while のループだと思うよ。
0465login:Penguin2008/01/17(木) 11:37:17ID:LfhUWWyD
>>450
> 2. bash依存
ksh88由来らしい
tp://www.cs.princeton.edu/~jlk/kornshell/doc/man88.html
ksh互換を期待できるなら使ってもいいんじゃね
0466login:Penguin2008/01/18(金) 01:58:10ID:S6Zw/ddB
/usr/games/random -e 100; echo $? は?
■ このスレッドは過去ログ倉庫に格納されています