トップページ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/
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
0786名無しさん@お腹いっぱい。2009/01/18(日) 15:56:51
仮に、正常終了時に標準出力に0を出すのだとしても、書くなら
while [ `gccのプログラム` = 0 ] だよな。
0787名無しさん@お腹いっぱい。2009/01/18(日) 15:59:18
どうでもいい。
黙れ。
0788名無しさん@お腹いっぱい。2009/01/18(日) 16:02:41
>>780
$?を参照する方法なら文字列比較で構わないよ。
変数の値は文字列だから
0789名無しさん@お腹いっぱい。2009/01/18(日) 16:37:43
>>788
だな。

>>780
-eq -ne 等を使う必要があるのは、たとえば、

3 03 003 0003 ... などを同一の値とみなす必要がある時。

[ 003 -eq 3 ] && echo 同じ
とか。

$? の場合は、0〜255の普通の値しか入らない(00とか000とかにはならない)から、

[ $? != 0 ] で判定して良い。
0790名無しさん@お腹いっぱい。2009/01/18(日) 16:43:52
>>788

無様なコードでも動けばそれでいいというわけだ。
0791名無しさん@お腹いっぱい。2009/01/18(日) 16:44:41
>>781
プログラム終了コードを -1 にしたことが
問題だったのなら、的確な答えは、
>>766 + >>764 が正解

>>767 ではプログラムの終了コードが0か否かしか
判定できない手法なので、残念ながら完全に間違い。
>>761 の要求は満たしてない。
0792名無しさん@お腹いっぱい。2009/01/18(日) 16:47:05
終了コードが3種類以上ある場合、

case $? in
0) hoge;;
1) hoge;;
255) hoge;;
*) hoge;;
esac

みたいに書くこともある。
case文は文字列としての比較しかできない。

「$?を文字列として扱ってはいけない」というルールなら、
caseで効率良く書くことも否定することになる。

それは明らかにおかしい。
0793名無しさん@お腹いっぱい。2009/01/18(日) 16:48:03
というか、ちょっと前から沸いてる >>781 って
多分 >>767 と同一人物だと思うんだけど
なんか自分の答えが正解と言い張って、他人の答えを間違いと
断言する性癖があるね

もう少し余裕もった方がいいと思うよ
0794名無しさん@お腹いっぱい。2009/01/18(日) 16:52:19
>>791
違う。

質問者が本当に「エラーコードが-1かどうか」を判断したかったのなら、

質問でも、(間違った文法だけど)
while [ gccのプログラム != -1 ]
と書いていたはず。

実際には
while [ gccのプログラム = 0 ]
と書いて質問したのだから、
質問の「仕様」は、エラーコード0かどうかで判断するということで正解。
0795名無しさん@お腹いっぱい。2009/01/18(日) 17:06:08
>>794

そもそも、(もし釣り質問で無いなら)
質問者が、どうしていいか訳が分からなくなってる質問内容の
一分だけが、正確に質問者の意図を反映しているというのは強弁。
0796名無しさん@お腹いっぱい。2009/01/18(日) 17:27:44
>>791

もう少し前後のレスをよく読むこと。
>>764だと無限ループになる。
0797名無しさん@お腹いっぱい。2009/01/18(日) 18:32:56
揚げ足取りするつもり無いけど自分が正しいと主張する人は

>>764
× ture: 綴りも違うし、区切りがコロンになってる
○ true;

>>779
× while gccのプログラム; [ $? != 255 ] 条件部分は1つのコマンド/パイプライン(相当)しか書けない
○ while ( gccのプログラム; [ $? != 255 ] )

雑はやめてくれ
07987972009/01/18(日) 18:35:48
変な形で繋がったけど
× 条件部分は〜
○ while の条件部分は〜
0799名無しさん@お腹いっぱい。2009/01/18(日) 18:40:13
雑はやめてくれ
0800名無しさん@お腹いっぱい。2009/01/18(日) 19:01:16
>>797
嘘を書いてるのはお前。

whileの条件部分に書けるのは「パイプライン」じゃなくて「リスト」
リストというのは複数のパイプライン。

while gccのプログラム; [ $? != 255 ]
↑は正しい。


× while ( gccのプログラム; [ $? != 255 ] )

サブシェルが無駄。
0801名無しさん@お腹いっぱい。2009/01/18(日) 19:08:06
おれも >>800 が正しい、に1俵。
whileの条件部分には、( ) なしで2個以上のコマンドが書ける。

>>797
試しに、↓みたいなの実行してみろ。

i=1; while echo $i; i=`expr $i + 1`; [ $i -le 10 ]; do :; done
0802名無しさん@お腹いっぱい。2009/01/18(日) 19:09:52
>>799
失礼雑だった

>>800
リストまではOK

> while gccのプログラム; [ $? != 255 ]
>↑は正しい。

は?
0803名無しさん@お腹いっぱい。2009/01/18(日) 19:14:32
>>802
おまえ、「リスト」知らんのか。

コマンド; コマンド;
みたいにセミコロンで区切ったのがリスト。(改行でもいいが)

リストが桶ということは、2個以上のコマンドが桶。

while gccのプログラム; [ $? != 255 ]
の代わりに、

while echo hoge; [ $? != 255 ]

とでもやってテストしてみろ。ちゃんと動くから。

あと、>>801 が書いてくれたテストプログラムも、
while の条件文に複数のコマンドを書いた例だな。
0804名無しさん@お腹いっぱい。2009/01/18(日) 19:16:46
たぶん、あれだろ。
>>802 は。「リスト」が、&& や || を使ったのしか駄目だと
勘違いしてるんじゃないかww

セミコロンでも改行でもOK。
0805名無しさん@お腹いっぱい。2009/01/18(日) 19:19:18
自演しておきながら、
よくまあ他人同士のふりができるな。

タイミングと言い、やりとりといい、
よくまあ毎回毎回同じパターンで
飽きないか?
0806名無しさん@お腹いっぱい。2009/01/18(日) 19:22:45
とりあえず、
>>797 の後半と、
>>802 の後半は大間違いなので、

>>797 = >>802 に釈明カキコを要求しとく。
0807名無しさん@お腹いっぱい。2009/01/18(日) 19:27:59
>>802
> リストまではOK

リストまではOKってことは、
>>797 の主張が間違ってたってことだよ。

hoge && hage && boke
hoge || hage || boke
hoge; hage; boke

上の3つは全部「リスト」。

ちなみに、
hoge
hage
boke

みたいに3行に書いても全体で1個の「リスト」。

while
hoge
hage
boke
[ $x -ne 0 ]
do
.....
done


みたいな変わった書き方もある。
0808名無しさん@お腹いっぱい。2009/01/18(日) 19:36:33
オナニーは人から見えないところでやれ。

ああ、見られないと出来ないのか。
0809名無しさん@お腹いっぱい。2009/01/18(日) 21:35:35
>>806

普通、人の間違いは指摘する事は有っても、
わざわざ、釈明せよ等とは言わないものだ。

お前、もう良いから、このスレから出て行ってくれ。
邪魔だ。
0810名無しさん@お腹いっぱい。2009/01/18(日) 21:48:36
shのオプションで何が一般的ですか
-fはよく見るけど何もないのもよくみるけど
0811名無しさん@お腹いっぱい。2009/01/18(日) 21:58:29
-f は csh じゃないの?
0812名無しさん@お腹いっぱい。2009/01/18(日) 22:43:58
>>797
恥晒しとくね

>whileの条件部分は1つのコマンド/パイプライン(相当)しか書けない
>whileの条件部分は1つのコマンド/パイプライン(相当)しか書けない
>whileの条件部分は1つのコマンド/パイプライン(相当)しか書けない
>whileの条件部分は1つのコマンド/パイプライン(相当)しか書けない
■ このスレッドは過去ログ倉庫に格納されています