トップページ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/
0671名無しさん@お腹いっぱい。2009/01/14(水) 15:24:10
>>669
>スペースの有る無しは単に変数の内部、つまり$の後ろと勘違いしただけ

ふつー、そんな勘違いあり得ないよ。
そういう勘違いが起きること自体、
この問題の場合は「空白の有無」が重要、ということに
>>669 が気づいていなかった証拠。

だから >>645 を見ても、その意味が >>669 にはわからなかったのだろう。

>>645 は、
「シングルクォートは終了(ぶった切れ)しても、シェルの引数としては続いている」
と言うことを言ってるんだよ。それが的確な答え。
0672名無しさん@お腹いっぱい。2009/01/14(水) 15:26:58
てか、>>665

そんなこと書いて知らない人が鵜呑みにしたらどうするんだ?

0と1は、まあtypoと大目に見ても、
オプションとか全く考慮していないのはどうか?
0673名無しさん@お腹いっぱい。2009/01/14(水) 15:27:29
そろそろサマリをくれ。
0674名無しさん@お腹いっぱい。2009/01/14(水) 15:29:18
>>672
typeじゃないよ。argv[1] で合ってる。
argv[0] は awk の文字列。
0675名無しさん@お腹いっぱい。2009/01/14(水) 15:32:18
>>670

>>正規表現中の「'」
内部に無い以上前後を一括りにしてしまっていると読むのは妥当。

>>671

だから>>644の質問に「空白の有無」なんて重要じゃないと何度言ったら・・
分からなくて当然で、明後日の回答内容なんて気にするわけないだろ。
斜め読みにきまってる。

>>シェルの引数としては続いている

こう言う常人には見えない文字が見えるのがエスパー
0676名無しさん@お腹いっぱい。2009/01/14(水) 15:35:08
>>673
>>665 がサマリとしてもよくまとまってると思う。

>>674 の言うとおり、typoじゃないね。
(674自身はtypeがtypoだがw)
0677名無しさん@お腹いっぱい。2009/01/14(水) 15:35:18
>>674

誰が、処理内容がargv[0]だと言った?

自分で第一引数って書いただろ。
まあ第一と第二のtypoということにしておいてもいいが、
そんなことより根本的におかしいだろ「重要」だなんて。
0678名無しさん@お腹いっぱい。2009/01/14(水) 15:38:27
>>676

そりゃ最悪だ。
嘘を重要といい、
明後日の事をくどくど書いて「問題の本質」だと?
0679名無しさん@お腹いっぱい。2009/01/14(水) 15:41:40
>>677
だからtypoじゃないって。

awk = argv[0] = 第0引数
awkプログラム = argv[1] = 第1引数

awkプログラム部分を「1つの引数にする」「2つ以上に引数に分けてはいけない」
ことは重要。

確かに、-F とか、その他awkのオプション引数が入る場合は
awkプログラム部分は argv[1]より後ろにずれるが、
そういうことを言ってるんじゃない。
0680名無しさん@お腹いっぱい。2009/01/14(水) 15:42:37
>>765
自分が理解できないということすなわち自分が無能であることを、
力説しているキミには同情を禁じ得ない。ww
0681名無しさん@お腹いっぱい。2009/01/14(水) 15:43:20
>>675
自分が理解できないということすなわち自分が無能であることを、
力説しているキミには同情を禁じ得ない。ww
0682名無しさん@お腹いっぱい。2009/01/14(水) 15:46:30
すごいな

苦し紛れに漢数字をアラビア数字に書き換えか。
0683名無しさん@お腹いっぱい。2009/01/14(水) 15:50:34
だからサマリーは
>>665 で決まり。


>>682
>>665 のどこにも漢数字なんてないよ。
苦し紛れに漢数字を勝手に使い出したのは >>677 だろ。
0684名無しさん@お腹いっぱい。2009/01/14(水) 15:51:44
>>675

理解できないんじゃなく価値が低いと看做したから
斜め読みしたと書いたつもりだが?

で、変数のところに空白がはいりゃそりゃ意味が変わるから
動かなくて当然だと早とちりしただけであり、
>>645>>644に対して何も言っていないと言う主張と全く矛盾しない
というか、極めて整合性が有る。
0685名無しさん@お腹いっぱい。2009/01/14(水) 15:54:17
>動かなくて当然だと早とちりしただけであり、

www
なんだ、>>646 の解答はやっぱり「早とちり」だったのか。
それがすべてだな。
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
だろ。
■ このスレッドは過去ログ倉庫に格納されています