トップページunix
987コメント345KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2008/10/16(木) 00:48:38
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。


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

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

前スレ
シェルスクリプト総合 その12
http://pc11.2ch.net/test/read.cgi/unix/1218277263/
0686名無しさん@お腹いっぱい。2009/01/14(水) 16:00:07
まあ良い。
シェルから見て第0引数という表現は
実に気持ち悪いが、まあ無いわけではないから許してやる。

しかしオプションを無視した上に、
別に何の変哲もないことを力説して、
重要だの本質だのというのは頂けない。
しかもawk特有の様に語るところがミスリードを意図しているようで気持ち悪い。

空白をセパレータとして認識するのはシェルだし、
パラメータを複数受け取っても、
それがコマンドにとって適正であれば動くし、
不適であれば動かないという一般的な話なだけであって、
敢えてawkを例に出して力説するような物じゃあ無い。
0687名無しさん@お腹いっぱい。2009/01/14(水) 16:03:59
>>685

恣意的な誘導だな。

>>646ではなく
>>649が早とちり(しかもどうでもよい)

だろ。
0688名無しさん@お腹いっぱい。2009/01/14(水) 16:04:47
>>686
>敢えてawkを例に出して力説するような物じゃあ無い。

あのー、もともとシェルスクリプト(#!/bin/sh)の中から
awkを呼び出す場合の話なんですけどー
敢えてawkを例に出したんじゃなく、
元々がawkを呼ぶ場合の質問。
その場合には「引数を1つにまとめる」ことが重要。
0689名無しさん@お腹いっぱい。2009/01/14(水) 16:11:08
>>686
>しかしオプションを無視した上に、

awkをワンライナー的に使う場合(シェルスクリプトの中のワンライナーも含む)は、
awkに各種オプションを付けることがあるが、

複数行に渡るawkプログラムを記述する場合は、
混乱を避け、書式を統一するためにも
awkのオプションは付けない方が言いよ。

例えば、-fオプションなら、プログラム中でawk変数のFSでセットできるわけだし、
FSの方を使った方が言い。

そういう意味で、awkのプログラムは argv[1]の位置に来る。
0690名無しさん@お腹いっぱい。2009/01/14(水) 16:13:23
>>689
typo発見。

× -fオプションなら、プログラム中でawk変数のFSでセットできる
○ -Fオプションなら、プログラム中でawk変数のFSでセットできる

でも言ってることは合ってるよ。
0691名無しさん@お腹いっぱい。2009/01/14(水) 16:15:18
>>688

#!/bin/sh

A=file1
B=fil2

awk '{
print
}' ''"$A"'' "$B"''

状況次第で引数を分断する事も重要。
0692名無しさん@お腹いっぱい。2009/01/14(水) 16:19:10
>>691
アフォか。

それ、「awkプログラム部分」はどこも分断されてないだろ。

awk自身の引数のファイル名のところの話じゃないんだよ。

主張しているのは「awkプログラム部分を分断せずにひとつの引数にまとめること」
0693名無しさん@お腹いっぱい。2009/01/14(水) 16:22:31
要するに、
>>600が、
書いた本人は勿論そう言うつもりは無いだろうが、
後半の文章だけを取り出すと大間違いなのに
>>665のようなスタンスだと、そのことに気づきにくいのが
問題なんだよ。

動くような引数を渡せば、echoもawkも動くし
そうでなければ、どれも動かない。

単純に引数を一つにまとめるのが重要と
決め打ちするのは良くない。
0694名無しさん@お腹いっぱい。2009/01/14(水) 16:24:27
ああ
>>660
の、間違いね。
0695名無しさん@お腹いっぱい。2009/01/14(水) 16:27:08
しょうもないののしりあいしてるとこに双方タイプミスとかするなよ

↓ 以下、タイプミスした方が論旨関係なく即刻負けね
0696名無しさん@お腹いっぱい。2009/01/14(水) 16:27:18
>>693
awkで、「awkプログラム部分」を、2つ以上の引数に分けて動くような例は
ありえない。

だから、「awkプログラム部分は1つの引数にする」と
決め打ちして何も間違いはないし、より論旨がはっきりする。
0697名無しさん@お腹いっぱい。2009/01/14(水) 16:32:59
>>692

君がそう言いたい事は分かっている。
しかし、君の書き方だと知らない人は確実に誤解する。

そう言う意味で、
>>644が「シングルクォートの後ろで空白が入るとどうなるんですか?」
というような質問でもないのに、>>645を書いたのが
何の説明にもなっていなく、誤解の元だというのが私の唯一の主張。
0698名無しさん@お腹いっぱい。2009/01/14(水) 16:36:25
誤解誤解って、どう誤解するの?確実にっていっても想像でしょ?
0699名無しさん@お腹いっぱい。2009/01/14(水) 18:54:23
>>646は、まだ見苦しく言い訳続けてるの? とことんがんばれ。www
0700名無しさん@お腹いっぱい。2009/01/14(水) 19:01:48
つ−か >>646>>646 を煽ってる奴も
知識レベルは同程度だろう
仲良くしろ
0701名無しさん@お腹いっぱい。2009/01/14(水) 19:23:54
>>645がすべてだからねえ。
それを理解できない馬鹿が己の馬鹿っぷりを力説しているだけ。
0702名無しさん@お腹いっぱい。2009/01/14(水) 22:21:05
>>700

別に知識レベルを争っている訳じゃないだろ。
まあ君のような高尚な知識は、現実世界には不要だろうがね。

>>701

まだ言ってるよ。
馬鹿じゃねーの。

的外れと言う指摘を脳内変換して
間違いだと言われたと勘違いして
相手の論を勝手にでっち上げ、攻撃する屑よ。
0703名無しさん@お腹いっぱい。2009/01/14(水) 22:42:51
まとめると、>>646>>645を理解できない。
0704名無しさん@お腹いっぱい。2009/01/14(水) 22:55:49
>>703

良かったね。
君のところではまともに動く物が、
ウチでは理解出来ないで、空白が混入して動かない訳だ。

君のところが儲かって結構な事じゃないか。
そう解釈してくれるなら、実際ウチも嬉しいから、
がんがれ。
0705名無しさん@お腹いっぱい。2009/01/14(水) 23:02:57
>>645
は何の実例も提示せず、後付の言い訳に終始する。
>>646は、豊富な実例を実際に表記している。

この一事をもってして、軍配がどちらに上がるか
自明の事であろう。
0706名無しさん@お腹いっぱい。2009/01/14(水) 23:09:34
まとめると、>>646>>645を理解できない。
0707名無しさん@お腹いっぱい。2009/01/14(水) 23:14:12
>>690の自演も見苦しい。

そもそも重要なのは>>689の言う
-f オプションは、関数などをライブラリ化したファイルを読むのに
必須であり、決してシェルスクリプト中にオプションを記述するのが
忌避されている訳ではない証左ということ。
ちなみに-vオプションだって頻繁に使う。
-Fだってケースバイケースなのに無理やり自己の論に
押し込めようとするから破綻する。

とにかく、自分の枠で決めつけるのはよせ。
0708名無しさん@お腹いっぱい。2009/01/14(水) 23:14:48
>>705
お前ほんとに >>646 本人か?

>>646 の発言として
>>697 より引用するが、

> >>644が「シングルクォートの後ろで空白が入るとどうなるんですか?」
> というような質問でもないのに、>>645を書いたのが
> 何の説明にもなっていなく、誤解の元だというのが私の唯一の主張。

「唯一の主張」って言ってるね。
つまり、>>646 は、>>644 の解答は的はずれだったことは暗に認めているわけだ。
そして、残った「唯一の主張」として、>>645 の解答でも「誤解の元だ」
と言ってるに過ぎない。
実際には誤解の元とは思わないが、少なくとも >>645 の解答で正解なのは事実。

よって、軍配はすでに >>645 に上がっていることを >>646 も認めている。
0709名無しさん@お腹いっぱい。2009/01/14(水) 23:19:46
同じような書き込みを何回もするなよ
0710名無しさん@お腹いっぱい。2009/01/14(水) 23:21:29
>>707
それは awkプログラム文字列が argv[1]の位置に来ることが多いから
わかりやすくそう言っているだけで、
論点は「ひとつの引数にプログラムをまとめる」ことだから、
今の議論と関係ない -v とか-F オプションを持ち出すのは論点をぼかすだけだよ。
だからあえてオプションのことは言わずに argv[1]と言っただけのことと思われる。
0711名無しさん@お腹いっぱい。2009/01/14(水) 23:24:34
馬鹿でもわかるように1行にまとめてやろう。>>646>>645を理解できない。
0712名無しさん@お腹いっぱい。2009/01/14(水) 23:25:57
>>707
どうでもいいが、ワンライナーでもないのに awk の -v オプションを使うのは
非常にお勧めしない。
きちんと BEGIN { } の中で変数に代入すること。

あと、-f は #!/usr/bin/awk -f なスクリプトの場合に使うべきもので、
シェルスクリプト中にawkプログラムを各場合は、-f オプションとは両立しない。
(-f を付けたら引数からはプログラムを読まなくなるので)
0713名無しさん@お腹いっぱい。2009/01/14(水) 23:32:52
>>712

パラドックスを書くな。

-f も、-v も何度でも使える。
0714名無しさん@お腹いっぱい。2009/01/14(水) 23:35:36
>>713
「何度でも使える」かどうかを言ってるんじゃないよ。

じゃあ聞くが、

awk -f prog-file

って書く場合に、どうやってawkの引数にプログラムを記述するんだ?
別ファイルじゃなくて、引数に直接プログラムを記述したい場合、
-fオプションは使えないだろw
0715名無しさん@お腹いっぱい。2009/01/14(水) 23:40:30
その場合、普通に書けば委員ジャマイカ?

この一時を以ってしても、
第○引数がどうでも良いことがわかるね。
0716名無しさん@お腹いっぱい。2009/01/14(水) 23:46:59
>>715
試してから書け。

awk -f prog 'BEGIN { ... }'

なんて書いても動かないぞ。

awk -f progfile

awk progstring
とは
エクスクルーシブ。
同時に使えない。
0717名無しさん@お腹いっぱい。2009/01/15(木) 00:05:35
1000まで続けるつもりですね。
0718名無しさん@お腹いっぱい。2009/01/15(木) 00:05:56
>>716

それって言っていることは>>714と同じだよね。
普通に書けば?
0719名無しさん@お腹いっぱい。2009/01/15(木) 00:09:48
>>718
だから、>>715 が「書ける」って言ってるから「書けない」と反論してるんだよ。

>>715 は、
awk -f prog-file

awk prog-string
を両立した例を示すこと。(不可能だけど)


言っとくけど、
awk -f prog1 -f prog2
じゃ駄目だよ。
あくまで「引数に直接」awkのプログラムを書くこと。
0720名無しさん@お腹いっぱい。2009/01/15(木) 00:12:09
じゃ、「>>646>>645を理解できない」は勝負あったという事でセカンドステージ開始ですね。
0721名無しさん@お腹いっぱい。2009/01/15(木) 00:16:19
じゃ、セカンドステージは、

>>714 = >>715 = >>716
「awkの -f オプションと、引数直接プログラム記述は両立しない」

と言う主張と、

>>713 = >>715 = >>718

「awkの -f オプションと、引数直接プログラム記述は、『普通に書ける』」

と言う主張と言うことで。
0722名無しさん@お腹いっぱい。2009/01/15(木) 00:21:40
セカンドステージは誤字即退場ということで。
0723名無しさん@お腹いっぱい。2009/01/15(木) 00:25:39
気持ち悪いな。

頼むからおまえら「シェルスクリプトを書いてます」
なんて、公言しないでくれな。

俺まで同類だと思われると困るから。
0724名無しさん@お腹いっぱい。2009/01/15(木) 00:40:54
特定ディレクトリに無数のスクリプトがあるんですが、
これらはある親シェルを起動すると実行されます。
ただ、子シェルでなくて、孫、曾孫シェルの可能性もあります。

この特定ディレクトリにあるスクリプトのうちどれが実際に起動されたかを調べる方法ないでしょうか?
すべてに起動ログをはかせるのはちょっと厳しいです。
0725名無しさん@お腹いっぱい。2009/01/15(木) 01:09:44
A. BSD accountingがあれば、lastcommで終了。
B. /bin/shに読まれて、access timeが変るので、ls -ltu してタイムスタンプ確認。
C. ptrace系のコマンド使う
D. /etc/profileでログを取る
0726名無しさん@お腹いっぱい。2009/01/15(木) 06:39:29
>>718
もしかして、>>718 の言う「普通に書けば」って、
「普通に -f を使わずに書けば」って意味じゃないの?

でもそれだと、
「シェルスクリプト中から、awkプログラムを直接引数に書いてawkを呼び出す場合、
-fオプションは使わない(使えない)」
という、>>716 = >>714 の主張を認めたことになる。

よって、セカンドステージは >>716 = >>714 = >>719 の勝ちということで終了。
0727名無しさん@お腹いっぱい。2009/01/15(木) 21:49:07
>>726は朝6時にレスなんてよほど悔しかったの?乙
シェルスクリプトスレなんでawkのオプションとかスレ違いなのにこんな話題しかないのかな
0728名無しさん@お腹いっぱい。2009/01/15(木) 21:56:44
>>713 = >>715 よ、
-f を何度使ってもいいから、

awk -f プログラムファイル 'プログラム文字列'

が両立できる方法を示せ。
君はそれが「普通に書ける」って言ったんだぞ。

間違いを広めると迷惑だから、
書けないなら「書けない」と訂正したらどうだ。
0729名無しさん@お腹いっぱい。2009/01/15(木) 22:00:18
なんか自分がみっともないと思わんか?
0730名無しさん@お腹いっぱい。2009/01/15(木) 22:08:26
>>707 は勘違いしてるようだね。

> -f オプションは、関数などをライブラリ化したファイルを読むのに
> 必須であり、

↑って言ってるが、
この発言から、-f オプションで別ファイルに入った関数ライブラリを
読み込んだ上で、さらに awk引数でプログラムを書けると誤解しているようだ。

awk -f 関数ライブラリファイル

って記述したら、
awk引数にプログラムは書けない。

敢えて書くなら、

awk -f 関数ライブラリファイル -f プログラム本体ファイル

ってやるしかない。これではプログラム本体が別ファイルになるから
シェルスクリプトでこんなことはしない。
0731名無しさん@お腹いっぱい。2009/01/15(木) 22:13:34
ようやくセカンドステージが盛り上がってまいりました。
0732名無しさん@お腹いっぱい。2009/01/15(木) 22:17:44
と言うかさぁ、元祖大元の >>639 が書いた awkスクリプトが、
-f も -v も -F も使ってなくて、
argv[1] にプログラムを直接記述する方式だろ。

これが元になって始まった議論だから、
>>665 が、
「awkプログラムを、シェルから見て第1引数(argv[1])に与えることが重要」
って言ったんだよ。

argv[1]の[1]の数字はあまり重要じゃなくて、
argv[2]以降の別引数に分割せずに、ひとつのargv[*]だけにまとめること、
というところが主眼ね。

それを、>>639 にありもしない -f や -v や -Fオプションの話を勝手に持ち出して
>>672 が論旨と違うところに突っ込みを入れたのが間違い。

おそらく、話の流れを全然読んでなくて、途中から一部だけ読んで
突っ込んじゃったんだろうな。
0733名無しさん@お腹いっぱい。2009/01/16(金) 01:00:47
a='cat a.dat'
b='cat b.dat'
c='cat c.dat'

改行を*nで表現すれば

sedだけでしょ?

awk使いはきもいよ
0734名無しさん@お腹いっぱい。2009/01/16(金) 01:02:00
>>636
賢いな
0735名無しさん@お腹いっぱい。2009/01/16(金) 01:20:19
ラ…ラ…ア……ファ……
0736名無しさん@お腹いっぱい。2009/01/16(金) 01:36:34
>>725
ありがとございます
この中だとaccess timeで確認がいけそうなんで使わせてもらいます
0737名無しさん@お腹いっぱい。2009/01/16(金) 06:43:02
>>734
何いってんの?

>>636 は典型的な早とちりの間違い回答
そのことを >>638 がすでに指摘してる
0738名無しさん@お腹いっぱい。2009/01/16(金) 10:19:15
サードステージを始めさせようという釣りだと思う。
0739名無しさん@お腹いっぱい。2009/01/16(金) 13:45:16
シェルスクリプトで現在のユーザーでシェルを起動したときのプロンプトを取得したい
のだけど、どのようにすれば可能でしょうか?

bash限定でも構いません。
0740名無しさん@お腹いっぱい。2009/01/16(金) 13:59:18
「シェルを起動したときのプロンプト」ってどういう意味だよ。

localhost% bash

の「localhost%」がほしいのか?
ログインシェルなら、そもそも起動したときのプロンプトなんて存在しないし。
0741名無しさん@お腹いっぱい。2009/01/16(金) 14:23:30
>>740
bashが起動して、PS1が展開された結果です。
0742名無しさん@お腹いっぱい。2009/01/16(金) 14:37:30
echo exit | bash -i の結果を加工するとか
0743名無しさん@お腹いっぱい。2009/01/16(金) 14:54:56
promptがstderrに出力されるようだけど、
stderrをリダイレクトするとJob Controlできないというメッセージがでてじゃまくさい。
bash: no job control in this shell
[user@host ~]$ exit
0744名無しさん@お腹いっぱい。2009/01/16(金) 14:57:01
bashはインストールしてないから試してないが、環境変数EMACS=tで抑制できるかも。
0745名無しさん@お腹いっぱい。2009/01/16(金) 14:58:05
warningが必ず出力されるのが確かなら。
PROMPT=`echo exit | bash -i 2>&1 | sed -e 1d -e s/exit$//`
0746名無しさん@お腹いっぱい。2009/01/16(金) 15:00:40
>>744
ナイス!
0747名無しさん@お腹いっぱい。2009/01/16(金) 15:02:44
zshだと、

$ echo exit | zsh -i

すると、zshのプロンプトを出したままになり、exitしてくれない。
0748名無しさん@お腹いっぱい。2009/01/16(金) 23:44:37
a="this"
b="is a pen"
というふたつの変数があったとします。これらを結合してoptsに代入して

command ${opts}

としたときに、[this] [is a pen] というふたつの引数が渡された、と解釈させるようにしたいのですが
どういう風に連結すればいいんでしょうか。

opts="${a} ${b}"        だと [this] [is] [a] [pen]、
opts="\"${a}\" \"${b}\""  だと ["this"] ["is] [a] [pen"]
という風に解釈されてしまします。
0749名無しさん@お腹いっぱい。2009/01/16(金) 23:56:51
pshってどんなもんなの
もしもperl shellにしておくとperlの起動コストが無くなるとか言うならば
使いたい所だけれど
0750名無しさん@お腹いっぱい。2009/01/17(土) 00:11:08
>>748
$ a="this"
$ b="is a pen"
$ set "$a" "$b"
$ python -c 'import sys; print sys.argv[1]; print sys.argv[2];' "$@"
this
is a pen
$
07517482009/01/17(土) 00:30:47
>>750
変数に代入したいんですが、それはできないんでしょうか。

いろんな条件によって順にオプションを追加していく・・って感じのことがしたいんですが。
0752名無しさん@お腹いっぱい。2009/01/17(土) 00:58:04
>>751
パラメタにスペースが入らないルールにするのがベスト

それが出来ない場合、かつ、パラメタにダブルクォートが入らない
としてよければ、 >>748 にあるようにダブルクォートで括るのも
手かもしれない。その場合、eval するのが簡単でよいかと。

a="this"
b="is a pen"
opts=\"$a\" \"$b\""
eval command $opts
0753名無しさん@お腹いっぱい。2009/01/17(土) 01:00:35
タイプミス
opts="\"$a\" \"$b\""
07547482009/01/17(土) 01:26:49
>>752
オプションにはファイルパスが含まれるので、スペースやダブルクオートがないと仮定するのは
ちょっと厳しいです。

うーむ・・・
0755名無しさん@お腹いっぱい。2009/01/17(土) 01:37:12
やっぱり set が一番現実的だろう。
set --
set -- "$@" "$a"
set -- "$@" "$b"
って感じで。
0756名無しさん@お腹いっぱい。2009/01/17(土) 07:16:40
>>748
要するに、"$@" と同様のことを、一般のシェル変数でやりたいんだろ。

bash限定なら配列使っちゃえ。スペースもダブルクォートもOKだよ。

opts[1]="This"
opts[2]="is a pen"
command "${opts[@]}"
0757名無しさん@お腹いっぱい。2009/01/17(土) 07:57:50
>>755
純正シェルでは、set -- では引数が削除されないので注意。

必ず、
set dummy; shift
ってやること。
07587482009/01/17(土) 11:16:27
>>756
おお、これでできました。どうもありがとうございます。
bash依存ぽいですが、それくらいは仕方ないかと
07597482009/01/17(土) 11:58:00
ぽいというか、そうおっしゃってましたね。
失礼しました。
0760名無しさん@お腹いっぱい。2009/01/17(土) 22:18:35
だから、evalで良いのに。

なんで運動靴履くの?
0761名無しさん@お腹いっぱい。2009/01/18(日) 00:45:06
シェルを使い始めたばかりの初心者です。
gccのプログラムがエラーを返すまで自動で何度も実行するシェルを書きたいのですが上手くいきません。
下記のような書き方でやってみました。
gccのプログラムはリターン値が-1のときにエラーと仮定しています。
while [ gccのプログラム = 0 ]
do

done
レベルの低い質問で申し訳ないのですが、よろしくお願い致します。
0762名無しさん@お腹いっぱい。2009/01/18(日) 02:13:10
シェルってゆうな。クズ。
0763名無しさん@お腹いっぱい。2009/01/18(日) 07:13:33
>>761
while true; do command && break; done
0764名無しさん@お腹いっぱい。2009/01/18(日) 07:26:10
>>761
while command; do
:
done
ただこれだと>>763と同じで、exit値0以外がエラー。
while ture: do
command
if [ $? = -1 ]; then
break
fi
done
これで-1の時だけエラーと見做す。
0765名無しさん@お腹いっぱい。2009/01/18(日) 08:02:20
プログラムの終了コードが -1 ってのは良くない。
もしそうなら、

while [ gccのプログラム = 255 ] ; do hogehoge

とすればよいと思う。でも終了コードを1とかの正数に変えたほうがいいよ
0766名無しさん@お腹いっぱい。2009/01/18(日) 08:07:21
ああ、なんか読み落としていた。
>>761 がつまづいたのは、$? を使ってないことなのか。
でも >>764 の $? の比較は、255と比較すべきじゃないの?

0767名無しさん@お腹いっぱい。2009/01/18(日) 09:13:30
>>761
文字列の比較じゃないのに test [ ] を使ってるのが間違い。

while gccのプログラム
do
...
done

でよい。
whileはもともと終了コードをチェックする文法。
通常、testコマンドである [ ] と組み合わされるが、
この場合は gccの終了コードを直接チェックするから、[ ] を書いてはいけない。

(ほかに、$?を使う方法もあるが、while gcc ... って書けば $? も使わなくていい)
0768名無しさん@お腹いっぱい。2009/01/18(日) 09:16:57
>>761

すげー、回答者全滅。
>>763->>767 すべて間違い。

以下が正解。

until gccのプログラム
do
...
done


whileとは終了判定が逆の until文を使う。
0769名無しさん@お腹いっぱい。2009/01/18(日) 10:06:50
エラーを返すまでだからwhileでいいんじゃねーの?
0770名無しさん@お腹いっぱい。2009/01/18(日) 10:52:25
てか、
while [ command -ne -1 ]
do
...
done
だろ。
0771名無しさん@お腹いっぱい。2009/01/18(日) 11:00:06
while gcc ...
      [ $? -ne 255 ]
do
    ...
done
だろ。
0772名無しさん@お腹いっぱい。2009/01/18(日) 12:06:06
>>768 すげー、無様。

>>763-764が正答なのに。
07737712009/01/18(日) 12:27:13
>>772

実験したら、>>771では駄目だと判明。
もちろん>>763-764も駄目。
>>765-767あたりも参考にすべき。
どうもtestは数値を1バイトの符号なし整数とみなすようだ。
これはunixコマンドの終了ステータスが0-255の範囲であると
定められていることと関係するのだろう。

smpl.c
#include<stdlib.h>

int
main(int argc, char *argv[])
{
int i = atoi( argv[1]);
return (i);
}

jikken.sh
#!/bin/sh
set -x
i=1
while true; do
./a.out $i
if [ $? -ne 255 ]; then
echo "OK"
else
echo "error" && break
fi
i=`expr $i - 1`
done
07747712009/01/18(日) 12:32:57
すまん、testの仕様じゃなくて、
終了ステータスを出す側が符号なし整数でだしてた、
いずれにしても。

実行結果
+ i=1
+ true
+ ./a.out 1
+ [ 1 -ne 255 ]
+ echo OK
OK
+ expr 1 - 1
+ i=0
+ true
+ ./a.out 0
+ [ 0 -ne 255 ]
+ echo OK
OK
+ expr 0 - 1
+ i=-1
+ true
+ ./a.out -1
+ [ 255 -ne 255 ]
+ echo error
error
+ break
0775名無しさん@お腹いっぱい。2009/01/18(日) 13:23:58
最凶の釣り師だな。
「gccのプログラム」、「リターン値が-1のときにエラー」、「シェルを書きたい」
0776名無しさん@お腹いっぱい。2009/01/18(日) 13:54:20
>>775
揚げ足取ってないで早く教えろよ
0777名無しさん@お腹いっぱい。2009/01/18(日) 14:06:42
>>776
だから、>>767 が正解。

255とかにこだわらず、0か0以外で判断すれば良い。
0778名無しさん@お腹いっぱい。2009/01/18(日) 14:19:59
>>777

終了ステータスが0-255まで有ると言うことは、
非ゼロで有っても何らかの理由でその数値を利用するため。

ゼロ以外は何らかのエラーで有るという考え方はOKだが、
何でもかんでも処理を中断して良い訳じゃない。
そこは、プログラムの仕様で判断するべきだし、
今回の仕様は>>761
0779名無しさん@お腹いっぱい。2009/01/18(日) 14:56:19
>>788
だったら、以下のとおり。
これくらい応用して考えろよw


while gccのプログラム; [ $? != 255 ]
do
...
done
0780名無しさん@お腹いっぱい。2009/01/18(日) 15:02:04
>>779

終了ステータス判定に文字列比較演算子を使うな。

要するに、>>761への回答は、
「gccプログラムの終了ステータスは-1には出来ません」

gdb で return(-1); なプログラムを動かしたら、
Program exited with code 0377.
だと。
0781名無しさん@お腹いっぱい。2009/01/18(日) 15:02:45
>>778

いや、今回の質問は、そもそもエラーコードの受け取り方を
>>761 が勘違いしていたのが原因なのだから、
その原因に対する的確な答えは、
>>767 が正解。

>>761 で、「リターン値が-1のときにエラー」とは言っているが、
これはその「gccのプログラム」が 「return -1;」と記述されていることを
言っているに過ぎず、質問のポイントとなっているのはエラーコードの値ではない。
実際、-1 とか 255とか、数値の問題でうまく動かなかったのじゃなく、
while [ gccのプログラム = 0 ] みたいな間違った書き方をして動かなかったのだから、
それに対する指摘が正しい回答と言えよう。
その意味でも >>767 が正解。

エラーコード=255を杓子定規に解釈すれば >>779 だが、
これが本当に意図していた回答かどうかは疑問。
0782名無しさん@お腹いっぱい。2009/01/18(日) 15:18:18
>>781

そこまで深読みして考えるなら、
もう少し突っ込んで>>775にたどり着くべきだな。
0783名無しさん@お腹いっぱい。2009/01/18(日) 15:23:28
>>782
深読みじゃないよ。質問で [ gccのプログラム = 0 ] って書いてるんだから、
エラーコードが 0 かどうかチェックしたいと言う意図だろ。
それが質問の「仕様」。
0784名無しさん@お腹いっぱい。2009/01/18(日) 15:32:41
どうでもいい。
黙れ。
0785名無しさん@お腹いっぱい。2009/01/18(日) 15:37:06
>>784
顔真っ赤にして大変ですねw
■ このスレッドは過去ログ倉庫に格納されています