[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/25 03:18 / Filesize : 212 KB / Number-of Response : 865
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

シェルスクリプト総合 その19



1 名前:シェルスクリプトライター mailto:sage [2011/12/10(土) 20:06:40.38 ]
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。

□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
 FreeBSDユーザは/bin/shの正体がashなので注意。
 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
  src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/
  heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
 (理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。

前スレ
シェルスクリプト総合 その18
hibari.2ch.net/test/read.cgi/unix/1308195527/

次スレは >>970 で。

460 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 08:14:18.54 ]
>>458
-exec の方が古い感覚だけどどうなんだろ?

461 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 08:17:25.43 ]
>>460
-exec ';' なら古い感覚
-exec + は新しい感覚

462 名前:460 mailto:sage [2012/03/11(日) 08:29:08.31 ]
>>460
+ はいま使っているマシンの中では使えない物がほとんどかも。

-exec は元々 Unix に魅せられたポイントなので、1989 年には使ってた。
xargs はネットで教えてもらって 1995 年頃から使い始めた。
けど確か元からあったかも。

463 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 08:32:05.19 ]
>>462
-exec + はSolarisでさえ使えるのに、どんな古いOS使ってるんだよ?

464 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 08:54:41.56 ]
POSIXにも入っていてSVR4由来(当然Solarisにもある)でHP-UXにもあるのに、
使えないのを探す方が難しいよね。
原始人と言われたからってムキになってウソを教えるのは良くないな。

www.pasc.org/interps/unofficial/db/p1003.2/pasc-1003.2-210.html
| One of these extensions, which I believe is supported at least on all
| systems derived from SVR4 and on HP-UX (although in some cases it is an
| undocumented feature), is a variant of the "find -exec" primary where
| "find" does argument aggregation internally:
|
| find . -type f -exec some_command {} +

465 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 09:52:56.43 ]
ちょっと前までテンプレにfindの項があったと思うが、今は無くなってるな。
確かテンプレではfind -print0 | xargs -0推奨で、スレ内議論では-exec +を使えと主張する人がいた。

466 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 10:09:06.10 ]
テンプレにあったのはfind -print | xargs という回答には必ず言いがかりが付け
られていたから。質問者のためではなく回答者のためのテンプレ。
-exec {} + 構文が紹介されてからはxargsを使う意味がなくなったのか削除された。

それでもしばらくは-exec {} + を知らない原始人がいたけど、そのたびに原始人と
呼ばれて、絶滅していった。テンプレから削除されたのはこの時点(絶滅後)かも。

-exec {} + ですべてが置き換え可能とは言わないが、find+xargsが必要になること
は極めてまれ。

467 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 10:32:32.19 ]
うーむ、結局その2つ違いって何ですか?

あと、パイプで繋がってしまっているrmを画面にも出力する方法ってないんでしょうか?

468 名前:460 mailto:sage [2012/03/11(日) 10:44:50.32 ]
俺が xargs 教えてもらった頃は
-exec は fork するから良くないと言われてた。

+ は SVR4 に入っているのなら俺のもだいたい動くね。
でも俺まだ Tower の SVR2 や SVR3 とも格闘してるから。
ファイル名の長さが 14 文字までのやつ。



469 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 10:44:55.57 ]
>>467
2つの違い
-print0や xargs -0は使えないOSがある。

>パイプで繋がってしまっているrmを画面にも
tee

470 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 10:55:09.82 ]
>>467
1 find -exec \; 構文ではファイル一つ毎に別プロセスが起動されるので効率が悪い。
2 そこでまとめて処理できるようxargsが作られた。初出はPWBだからかなり古い
find -print | xargs
3 ファイル名に改行入れられるとヤバいので-print0, -0が設けられた
 find -print0 |xargs -0
4 そんな面倒な事しなくて済むように-exec {} + 構文が作られた
 -exec \; 構文と違い、別プロセスは(MAX_ARGSを考慮して)まとめて実行される。

> あと、パイプで繋がってしまっているrmを画面にも出力する方法ってないんでしょうか?
find ほにゃらら -delete -print |tee /dev/tty| wc -l
find ほにゃらら -exec rm -v {} + |tee /dev/tty| wc -l

471 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 10:56:05.20 ]
> -print0や xargs -0は使えないOSがある。

例えば?

どっちも相当昔からある気がするけど

472 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 10:58:21.95 ]
>>471
ちょっとは自分で調べろよ。Solarisで-print0等が使えないのは常識。

473 名前:460 mailto:sage [2012/03/11(日) 11:04:39.92 ]
>>470
+ 便利そうだな。

474 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 11:06:35.90 ]
-0はFreeBSD 2.1.5-RELEASEにはない。FreeBSD 2.1.6.1-RELEASEにはある。
相当昔といえば言えなくはないが。

www.freebsd.org/cgi/man.cgi?query=xargs&apropos=0&sektion=0&manpath=FreeBSD+2.1.5-RELEASE&arch=default&format=html

www.freebsd.org/cgi/man.cgi?query=xargs&apropos=0&sektion=0&manpath=FreeBSD+2.1.6.1-RELEASE&arch=default&format=html

475 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 11:22:05.20 ]
結局、自分が使ってるOSで使える方法を使えって結論になってるよね毎回

476 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 11:29:54.60 ]
答える側は質問者の環境を想像すべきだな。
SVR[23]のような骨董環境前提の回答なんか意味ない。

477 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 11:38:38.97 ]
それなら結局xargsでも-exec +でもどっちでも良いんじゃない?十分に新しいLinux/*BSD環境前提なら。
自分はタイプ数の多いxargsは使わないけどね。
無用な-exec \;と-0無しのxargsさえ避ければ良い。
そもそも今回は-deleteが使えるならxargsも-exec +も要らないし。

478 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 11:42:53.84 ]
>>477
だから、使える方法を使えばいいってことでしょ?
結論見えてないの?



479 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 11:51:09.25 ]
>>469>>470
できました!!ありがとうございましたm(_ _)m

480 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 15:05:46.64 ]
>>470
> 3 ファイル名に改行入れられるとヤバいので-print0, -0が設けられた

改行というか、広い意味での空白($IFS)だな。

481 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 15:27:32.53 ]
xargsは、$IFSの改行/スペース/TABだけじゃなく、
シングルクォート/ダブルクォートも解釈しちゃうという問題がある。

it_don't_mean_a_thing.mp3

とかのファイル名もそのまま通らない

482 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 20:30:34.37 ]
こういうイヤーンなファイル名があるときって、makeが通らなくなって難儀する。
コロン(:)が含まれてるファイル名なんか最悪。。
FILES = $(wildcard *.mp3)

$ make hoge
Makefile:〓: *** multiple target patterns. Stop.

483 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 22:43:26.33 ]
なんかもう素人の集団みたいになってるな

基本的な歴史としては>>470の通りなんだが
現代においてはfindで引っかるファイル数が数十万〜数百万ということも珍しくなくなった
そしてそのような場合{} +では処理できない、というか渡された先が悲鳴を上げる
だから 5. としてxargsを-n付きで使うようになったわけ
>>481みたいな問題にもちゃんと解法はある、つーかググレカス

ゆえに{} +はファイルを渡す先が確実に処理できると確信できる場合だけ使うべきで
癖をつけるなら-print0 | xargs -0の流れが正しい
何か問題が起きてもxrgsにオプション足すだけで解決する

つーか、初期の頃はちゃんとそう説明する奴が居たはずだけどな…

484 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 23:15:55.26 ]
>>483
> 現代においてはfindで引っかるファイル数が数十万〜数百万ということも珍しくなくなった
> そしてそのような場合{} +では処理できない、というか渡された先が悲鳴を上げる

<limit.h>に従った正しいプログラムなら何の問題もないです。

> だから 5. としてxargsを-n付きで使うようになったわけ

これはあほなプログラム向けです。


485 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 23:18:50.93 ]
不特定個数の引数をとれるという仕様にもかかわらず悲鳴あげるのはバグ。
引数の個数に制限がある場合にはxargs -nも有効だが、そんなヘナチョコ
コマンド出会ったことない、具体的には何?

486 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 23:24:03.91 ]
>>483
その根拠は何?
pubs.opengroup.org/onlinepubs/009604599/utilities/find.html
> The size of any set of two or more pathnames shall be limited
> such that execution of the utility does not cause the system's {ARG_MAX}
> limit to be exceeded.

>>484
あほなプログラムの実例
savannah.gnu.org/bugs/?func=detailitem&item_id=16738

487 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 23:37:58.77 ]
というわけで2006年以前のfindutilsを使う可能性がある人は、
バグがあるので -exec {} + はやめたほうがいいということになるのかな

488 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 07:42:10.36 ]
>>483は渡された先が悲鳴あげるといっているので、それは違う。
もっとも、>>483がその区別をつけられないだけかも知れないが。



489 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 17:53:31.98 ]
結局>>483はボケ老人のタワゴトって結論でいいですか?
・悲鳴あげるヘナチョココマンドの存在は不明
>>481のようなケースも-print0, -0で対処できるている。

490 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 18:00:08.91 ]
>>489
>>481 はそういうことを言ってるんじゃない。
>>480 が $IFSだけが問題と言っているのでは誤解を生じるので、
それだけじゃなくクォートも、と言う話。

491 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 18:05:46.84 ]
>>490
ボケ老人のタワゴトとは>>483の↓この発言。>>481の指摘は正しい。
> >>481みたいな問題にもちゃんと解法はある、つーかググレカス

492 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 18:22:03.41 ]
まあxargs対策でエスケープすればいいんだから、findの出力をfilterするなり解法はあるわな。

> 何か問題が起きてもxrgsにオプション足すだけで解決する

こっちのほうが問題では。

493 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 18:28:41.55 ]
GNU findutilsは、デリミタを指定すると(-d, -0)、quoteは無視するようになっている。
他のfindは使ってないので知らないが。

494 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 18:29:11.30 ]
print0でNUL文字を区切りにしたんだから、ファイルシステムに
許されているいかなる文字もこれで対応でしょ。

> 何か問題が起きてもxrgsにオプション足すだけで解決する
その問題とは? >>483のボケた脳内にある悲鳴あげるコマンド
しかないのですよ。

495 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 19:10:17.94 ]
今までなかったからこれからもないと信じるのはどうなのと思わなくもない

496 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 19:15:52.59 ]
>>483の脳内には現実に存在するみたいですよ。

497 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 22:17:38.36 ]
お前らって、本当、どうしようもないバカだよな

ちったぁ議論らしいことをしたいなら、前提について定義しろよ

お前ら何のOSの事を想定してんだ?Solarisか?AIXか?386BSDか?バージョンは?え?
使ってるコマンドはどこの物だ?OSについてきたコマンドか?GNUのやつか?バージョンは?え?

そこが全然明確じゃないから、いっつもいっつもループしてんのか前に進んでんだか
前にも進んでないんだか分からねえグダグダ展開になってんじゃねえか

お前らの脳内それぞれで、前提狂った状態で、全然違うOSの事で話をしてたって、
意味も価値も実りある結論も、何もありゃしねえんだよ

お前らって、本当、どうしようもないバカだよな

498 名前: 忍法帖【Lv=2,xxxP】 mailto:sage [2012/03/12(月) 22:21:20.93 ]
結局どっちがいいの?
find . -print0 | xargs -0 -I{} mv -vb {} ../tmp

とかした時って同名なのにバックアップ取られないファイルがあったんだけど、-exec +ならちゃんとバックアップされる?



499 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 22:24:10.73 ]
>>497
バカからも得られるものはあるものさ

バカってのはこういう事を考えてるんだ、こんな風に誤解してるんだ、その程度しか知らないんだ、
じゃあ分かってない人はその辺が分かっていないのかもしれないから、ちょっと注意しよう

そんな目線での考察や気づきは、やっぱりバカからしか得られないものなのさ

500 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 22:33:58.20 ]
分かりやすい自演

501 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 22:37:33.62 ]
>>498
find、xargs、mvの仕様、及びファイル名の状態(空白含んでるとか、日本語ファイル名だとか)次第

どんな名前のファイルがこようがこれなら何でもOKという万能包丁は、ぶっちゃけ無い

FAQにも割とマジで"Use Samba and explorer.exe"ともある

502 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 23:04:49.76 ]
バックグラウンドで何かを起動すると、
ジョブ番号とPIDが表示されるじゃないですか。
あれって表示させなくする方法ってあるんでしょうか?

時間のかかる処理をバックグラウンドで走らせて
その間に別の処理をやって、waitで同期する、
みたいなことをやるスクリプトで、邪魔なんですよね。


503 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 23:08:46.69 ]
>>498
両方使えば?っていう初心者の意見です

504 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 23:19:19.45 ]
>>502
スクリプト実行しているシェルは何?

505 名前:名無しさん@お腹いっぱい。 [2012/03/12(月) 23:21:09.67 ]
bourne shだったりcshだったり。
Solarisです。


506 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 23:30:30.20 ]
csh使うのやめろ
shは出ない

507 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 23:46:04.45 ]
>>497
>>1

508 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 23:46:40.54 ]
>>498
やってみればわかるよ



509 名前:265 mailto:sage [2012/03/13(火) 00:27:03.89 ]
>>508
find . -exec cp -vb ../tmp +

find: -exec: no terminating ";" or "+"
だって・・・

510 名前:265 mailto:sage [2012/03/13(火) 00:27:31.16 ]
まちがえた
find . -exec cp -vb {} ../tmp +

511 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 04:25:42.37 ]
結局、print0 とかが必要になるのは
Windows でファイルを処理しきれなかった時ばかりなので

Unix 上のコマンドじゃなく
Windows ネイティブな UNIX-Like tools が
完璧なファイル名対応出来ればいいんだけどな。

Unix 上ではそんなファイル作らない。

512 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 10:06:48.40 ]
みんなそんなに移植性必要なの?

513 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 10:12:13.36 ]
> 結局、print0 とかが必要になるのは
> Windows でファイルを処理しきれなかった時ばかりなので
違うよ。root権限で動作するスクリプトが毒食わせられないための用心。

514 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 10:38:44.75 ]
>>512
移植性が必要ならシェルスクリプトなんて使わないよ

515 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 12:31:59.14 ]
ワンライナー手打ちするだけならそれこそどうでもいいし
それ以上気を遣いたいんなら、単にLL使えばよくね
Perlなら昔から標準でfind2perlとかついてくるし

516 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 23:03:21.13 ]
シェルスクリプトを作る際の考え方はある程度使いまわせるが、移植性は低いわな実際

まぁ考え方っつっても、それは別にシェルスクリプトでしか習得できない考え方ではないけれど

517 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 23:19:15.02 ]
autotoolsの中の人に聞かせてあげたい

518 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 23:27:28.51 ]
移植性のために数多くの制約に縛られるなんてのは、
シェルスクリプト的に本末転倒なことなのさ



519 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 23:30:41.17 ]
いや、移植性を突き詰めていくとシェルスクリプトで全部やるという結論に至る。

520 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/13(火) 23:50:33.10 ]
幸か不幸か自分のやりたい作業はシェルスクリプトで済んでしまう。perlもpythonもいらない。
だから(個人的には)シェルスクリプト GREAT! だね。

521 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/14(水) 03:14:56.05 ]
質問です。
cp a.txt b.txt
というシェルスクリプトが書かれた『hoge.sh』をダブルクリックで実行した場合、
普通はなんの反応もなく、コピーが実行されます。
これを、実行されたコマンドを端末に表示させることはできるでしょうか?

はじめから端末内で
bash hoge.sh
とすればいいのですが、深い階層にあって面倒なので…。
それに、この場合も何のコマンドが実行されたのかが分かりません。

522 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/14(水) 06:51:12.07 ]
>>521
hoge.shに以下のように書いておく。

xterm -e sh -xc 'cp a.txt b.txt; set +x; echo -n Hit any KEY:; read key'

523 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/14(水) 12:25:04.10 ]
>>522
ありがとうございました m(_ _)m

524 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/14(水) 23:14:00.92 ]
tarって入力されたデータをそのままの順でアーカイブするけど
-Tで渡すファイル名をソートする意味ってあるかな?

525 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/15(木) 18:42:17.16 ]
tarはアーカイブの先頭からファイルを展開していく
遅いテープに書き込むときに、早めに参照したいファイルをアーカイブの先頭付近に書いておくと
早めに展開される

そんな特性があるので、その特性を活かすためにアーカイブするファイルの順序を指定することは、
意味がある

わざわざソートして渡してるなら、その特性を理解してないだろうから、意味ないだろう

526 名前:名無しさん@お腹いっぱい。 [2012/03/15(木) 21:04:05.76 ]
どなたか↓わかる方、今週末中にお願いします。

────────────────────────────────────
不定個数の整数の引数を与えて実行すると,それらの整数のGCMとLCMを計算して
表示するようなシェルスクリプトを作成せよ.使用シェルは/bin/shとする.

【実行例】
$ ./kadai15.sh 12 20 24
GCM = 4
LCM = 120
────────────────────────────────────

527 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/15(木) 21:51:58.41 ]
GCMとLCMがわからん

528 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/15(木) 22:02:52.24 ]
lcmは最小公倍数だね。
gcmは最大公倍数? w



529 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/15(木) 22:13:31.83 ]
Greatest Common Measure
Least Common Multiple

>>528 はアホ

530 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/15(木) 22:20:19.95 ]
最大公倍数
最小公約数

531 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 00:21:54.70 ]
本当にどうでもいいことだが、gcm ってメジャーなんでしょうか?
普通の数学では gcd が圧倒的で、gcm は数学教育の教科書でしか
見たことがない。

532 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 00:26:08.56 ]
数学板で聞いたら。

533 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 00:49:16.79 ]
en.wikipedia.org/wiki/Greatest_common_divisor
ejje.weblio.jp/content/%E6%9C%80%E5%A4%A7%E5%85%AC%E7%B4%84%E6%95%B0


534 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 01:11:00.95 ]
SEだが>>526がわからんくて死にたい。
整数と小数の判定ってシェルでどうやんの?

535 名前:531 mailto:sage [2012/03/16(金) 01:13:58.15 ]
メジャーなんですねgcmだけに、と無理矢理言っておきます

536 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 05:58:58.34 ]
gcd()
{
a=$1; b=$2
while [ $b != 0 ]; do
t=$(($a % $b)); a=$b; b=$t
done
echo $a
}
t=$1; shift
for i; do
gcd=`gcd $t $i`
lcm=$(($t * $i / $gcd))
t=$lcm
done
echo gcd:$gcd lcm:$lcm


537 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 07:15:25.61 ]
>>536
不正解

引数 12 20 24 の時、
gcd:12 lcm:120 と表示される。

正しくは GCM = 4

あと、/bin/shでは動かない $(( )) とか

538 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 07:43:40.34 ]
>>537
freebsd の /bin/sh で動いたが




539 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 07:54:03.72 ]
>>538
>>1
>FreeBSDユーザは/bin/shの正体がashなので注意。

それより、GCMの計算が間違ってるので結局ダメ

540 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 07:54:54.99 ]
>>536
posix 互換の /bin/sh なら実装してるんじゃね $((expression))
pubs.opengroup.org/onlinepubs/009695399/toc.htm


541 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 10:00:20.84 ]
>>537
Solarisも/bin/shはkshになっちゃいましたよ、おじいちゃん

542 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 10:02:48.59 ]
gcdだけ作って秋田。
gcd()
{
local a b r

if [ $1 -gt $2 ]; then
a=$1; b=$2
else
a=$2; b=$1
fi

r=$(( $a % $b ))
[ $r -eq 0 ] && { echo $b; return; }

gcd $b $r
}


543 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 10:09:40.85 ]
>>541
なってねーよ。嘘書くな。

544 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 10:37:43.03 ]
>>543
なってるよ。おじいちゃん用のshは/usr/sunos/bin/shに隠居しました。

545 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 10:41:42.83 ]
>>544
なってないよ。
opensolaris ≠ solaris

あと、pdkshになってるopensolarisだとしても、
「正体はkshだから注意」ということで/bin/shのお題の回答としては不正解。

546 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 10:54:47.13 ]
ぷぷぷ

547 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 10:59:30.51 ]
Solarisなんていつまであるんだろうなぁ。

548 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 11:18:01.21 ]
$((expression))がサポートされてなければexprに書き換えれば
すむ事だから大した問題じゃないよね。
多分、/bin/shってお題はcsh使うなカスって意味だろうね。

おじいちゃんはこんなところで重箱の隅つついてないで、外へで
てゲートボールのエースでも目指した方がいいよ。



549 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 11:18:28.78 ]
gcd(){
i=$1
while [ $(($1%i+$2%i)) -ne 0 ];do i=$((i-1)); done
echo $i
}

g=$1
l=$1
while [ $# -gt 1 ]; do
shift
g=`gcd $g $1`
l=$((l*$1/`gcd $l $1`))
done
echo gcd=$g lcm=$l


550 名前:526 mailto:sage [2012/03/16(金) 11:44:30.22 ]
>>548
>多分、/bin/shってお題はcsh使うなカスって意味だろうね。

違います。従来からの/bin/shを使えという課題です。

>大した問題じゃないよね
それでは課題として点がもらえません。
大した問題かどうかは関係なく、課題通りの答が必要です。

引続き回答をお願いします。
表示形式も含めて課題です。

551 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 12:16:37.52 ]
User Environment Feature Changes - Transitioning From Oracle Solaris 10 to Oracle Solaris 11
docs.oracle.com/cd/E23824_01/html/E24456/userenv-1.html

552 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 12:19:43.22 ]
あらkshからbashになったのね。> Oracle Solaris 11の/bin/sh

553 名前:526 mailto:sage [2012/03/16(金) 12:23:58.00 ]
私の為に争わないでください
課題の回答だけお願いします

554 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 12:24:33.25 ]
>>552
えっと……どこをどう読めばそうなるのかとても不思議


555 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 14:29:31.51 ]
>>553
ちったぁ自分で考えろ

556 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 14:45:01.99 ]
>>552
> The default shell, /bin/sh, is now linked to ksh93. The default user shell is the Bourne-again (bash) shell.

the default user shell ってのは useradd したときのデフォルトとかの意味だろうね。
/bin/sh は ksh93 だ。

557 名前:526 mailto:sage [2012/03/16(金) 14:45:06.16 ]
時間が無い。早くしてください。
来週の月曜の朝10時までにお願いします。
過程とか不要です。答えだけ書いてください。

もし回答以外のことも書きたい場合はスクリプトを*で囲って
目立つようにしてください

書き方の例を示します

****************************
a = 3
x + y = 5
****************************


558 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 14:46:05.73 ]
今それどころじゃないからちょっと黙ってて。



559 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 14:51:59.23 ]
ここまで、
「宿題は自分でやれ」
「来年はちゃんと講義聞こうな」
なし

560 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 15:38:56.29 ]
分からない人は黙っててください






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<212KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef