シェルスクリプト総合 その37
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトに関する総合スレッドです。 全般 ・荒しは無視しましょう。 ・丁寧な姿勢を心掛けましょう。 ・ネチケット(死語)を意識しましょう。 ・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。 ・「POSIX原理主義」「ユニケージ」「USP研究所」はPOSIXとUnixを曲解し 間違ったシェルスクリプトを広めている宗教です。洗脳されないようにしてください。 前スレ: シェルスクリプト総合 その36 https://mevius.5ch.net/test/read.cgi/tech/1614212414/ 関連スレ ・【Bash】Windows Subsystem for Linux【WSL】11 https://mao.5ch.net/test/read.cgi/linux/1627507889/ ・Bashでプログラミング [転載禁止](c)2ch.net https://mao.5ch.net/test/read.cgi/linux/1443885102/ ・シェルスクリプト総合 その28 https://mevius.5ch.net/test/read.cgi/unix/1533154936/ ・zsh その7 https://mevius.5ch.net/test/read.cgi/unix/1337844883/ ・過去UNIXで使われていた ksh というシェルについて https://mevius.5ch.net/test/read.cgi/unix/1582358403/ ・【POSIX】UNIXプログラミング【BSD】 [転載禁止](c)2ch.net https://mevius.5ch.net/test/read.cgi/unix/1443103705/ ・おまえら! shell は何を使っているんですか? https://mevius.5ch.net/test/read.cgi/unix/1012330865/ >>145 なんか居たなw 赤の他人が悪絡みwのネタになるとでも思ってだろうとスルー >>147 ,144 >あ...>>989 の間違いだった(趣旨がトンチンカンの>>982 のに「まあ、これなんだよね(笑)」と同意してる) >誠にすまんことです >繰り返したぶん、 ID:FcrICImt にもすまん あ...>>12 ,136 で間違ってるのかと思った。間違ってないな、勘違いだった、どうかここは無かったことに >前スレ>>984 もワイやし あくまでも「なにいうてんねん、イキりをイジりはじめたんはワイのが先やろ?w」の拘りかっw勘弁してくれ、そのノリは一瞥にはわからんw レスバ乙。 最後に俺がまとめてやんよ。 終了ステータス0を真と見なすのはifコマンドの仕様です。 これでスッキリするな。 >>150 while until && || も まだやってたのか >シェルスクリプトだけじゃなくてC言語も成功は0を返さないとだめだって言ってんだろ 仕様書嫁 >>10 判ってる人間は「負論理」で済むはずなんだよな 結局「仕様書嫁」としか言い様が無い 1が真でも 0が真でも どっちでも良いんだよ >>12 Windows API は Boolean を返す関数が 0/1 以外に負の数を返したり普通にあるからな どっちもどっち ここまでコミュ力低いやつらはリアルで見たことないわ 運がいいのかこいつらがよほど特殊なのか >>150 それやと、また真偽バカを召喚しちゃうやろ!w if節の終了ステータスが0のときにthen節を、そうでないときにelse節を実行する、と実際の挙動のみをいえばよい。 >>154 正論理負論理は、2値の場合に使う考えかた。 整数についてはふつう言わない。 知ってる理屈をほかにムリヤリ適用すな! >>156 そういうのは初期の残念APIだから。。。 許してやろうや。。。 >>159 FORTRANの時代から算術IFというのがあった 分岐節が3つあって負、0、正の場合分け >>160 残念じゃなくてadhocなtype liftingなだけだ Cのポインタ返す関数がNULL返すのと同じ考え方 >>161 知らんがな。関係あらへん。w まあ、分岐の話をするんなら、CPUからやな。 ゼロフラグとキャリーフラグで3分岐できるもんやし。 >>162 理解力ないんか。。。 中盤以降は、そういうAPIはないやろ。 タイプセーフも強まっていったから、昔の挙げ足はええやろ、というとるんや。 >>165 すでに終わってるのに無理に絡むおまえのがキモいぞ シェルスクリプト使いにとってキモいは褒め言葉。 つか何でposixに終了ステータス0はtrue、1はfalseって書いてあんのに揉めてるの? >>167 どこに書いてあるかを言わないからだろ お前が揉める原因なんだよ いい加減嘘ついてあらすのはやめろ 127 や 126、1 から 125 にとは書いてるから >>167 は明らかに嘘だな >>168 終了ステータスは、 trueは0、falseは1は正しいが 0はtrue、1はfalseは正しくない というのがわからない残念な人なんだろう このようにどこに書いてあるのかを言えという 当たり前の質問にも答えられないわけですよ(笑) >>171 えと、本気で理解できないんだが詳しく教えてもらえないでしょうか。 >>173 その本のどこに書いてあるかを聞いてるんだが 理解してないの? いや、>>171 はたしかにおかしいな。w 反対や。 0はtrue、1はfalse(と評価されること)は正しいが、 trueは0、falseは1(の値をあらわすこと)は正しくない。 >>175 どこにってのは、どの項目かよく見ろと暗に示してるのかな? sh https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/utilities/sh.html EXIT STATUS The following exit values shall be returned: 0 The script to be executed consisted solely of zero or more blank lines or comments, or both. 1-125 A non-interactive shell detected an error other than command_file not found or executable, including but not limited to syntax, redirection, or variable assignment errors. 126 A specified command_file could not be executed due to an [ENOEXEC] error (see Command Search and Execution, item 2). 127 A specified command_file could not be found by a non-interactive shell. test https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/utilities/test.html EXIT STATUS The following exit values shall be returned: 0 expression evaluated to true. 1 expression evaluated to false or expression was missing. >1 An error occurred. >>177 理解しました。 >>178 testコマンドの部分は 引数で渡された式が真ならtestコマンドは0を返す(以下略 と書いてあるだけじゃん 真というのはtestコマンドのテスト式内の話 >>171 >trueは0、falseは1は正しい >0はtrue、1はfalseは正しくない ここだけ読むとイミフ >>171 >>177 どちらも可笑しい 仕様書に描いてあることが正しいのであって おまえの意見はどうでもいい >>177 ture/false コマンドに(Exit Status) 0 および1を返すと書いてある testコマンドに評価としてtrueとは書いてあるが、それは評価としてでその値が1なのか0なのかというのではないという理解だけど POSIXに書いてあるという話なら ぱっと流れを見てきただけだが、 []/test コマンドの評価が真で0を返すってところからはじまって、 他のコマンドの返り値もこれにならって処理成功で0を返すようになったというだけじゃないの? これをもって終了ステータス0が真を意味するってわけじゃないよねぇ 日本語と英語で、否定文に対する同意にyes/noが反対になるのと似てると思う 前者は否定文それ自体、後者は事象全体について、それぞれ評価してるよね >>177 trueコマンドのExit Statusは0、falseコマンドのExit Statusは1 評価した結果trueならExit Statusは0、falseならExit Statusは1 てことででの、trueは0、falseは1 (のExit Status) になるでしょ?? testコマンド(など)で書いてるtrueは一般的な文上でのtrue(例えばtest条件に一致する=真)と読んでるけどなあ って、よく読んだら同じこと言ってるのか。シェル内部(?)の部分の話かそれ>>177 は Exit Status が 0だったらtrue、1だったらfalse と評価されることは正しいが (ここはわかる) trueは0、falseは1(の値をあらわすこと)は正しくない (言いたいことはなんとなくわかるしだったら否定はしないが、うーむ) >>171 は、 >終了ステータスは、 から始まってるとおり(上にも書いたけど)、 trueは0、falseは1は正しいが (そういうExit Statusになる) だからといって、 シェルスクリプト上で 0はtrue、1はfalse(と見なすのは)正しくない てこと。下は「trueは0、falseは1(の値をあらわすこと)は正しくない」と同じ意味だわな >>183 >[]/test コマンドの評価が真で0を返すってところからはじまって、 >他のコマンドの返り値もこれにならって処理成功で0を返すようになったというだけじゃないの? Unixで動くプログラムはExit Statusが問題なければ 0、問題あればそれ以外というとこからはじまってかな。testコマンドもそれに合わせてのような Unixを作る上でのOSのUnixとしてのExit Statusとはどういうものかというのは最も先に考えるだろうから、そこからはじまってかな いまでも 0〜255 なんですか 256 以上とか 0 未満とか ありえないんですか? 8ビットいっぱいでの値(=unsigned char)となってるね、POSIXでは int main( ... ) だから、失敗なんぞで -1 をreturn できる(エラーにはならない)が、255になったりするねえ ん?まさか、trueコマンドとfalseコマンドを 真偽値のtrue/falseのことだって勘違いしてる? いやそんなアホはいないよねw 終了ステータスは数値であって true/falseじゃないよ はっきりした ただの独りよがり、マウントだけは取りたがり まあわかったようなのでいいけど >>183 終了ステータスは昔から0が正常終了、それ以外が異常終了という意味 シェルスクリプトのifは正常終了の場合にthenの中身を実行する それだけの話なのに真とか偽とか、trueとかfalseとか 言ってるやつがいるだけ trueコマンドは正常終了を返す fasleコマンドは異常終了を返す ifは正常終了か異常終了かで処理を分岐させるもので 真か偽かで処理を分岐させるものではない なにか必死感 >>175 なんて平気で偉そうに自分で調べる探すことはできないくせに まあこれ以上イジルのは止めようw 誰とは言わんがw某君は自分で調べることも探すこともできないは明らかだが、 そこからくる無知がコンプレックスからなんだろうなその常時上から目線すぐに誤魔化す癖なのは と思われるw >>190 例えばカーニハン、ロブパイク共著のTHE UNIX PROGRAMMING ENVIRONMENT のp140のif構文の説明には if command then commands if condition true else command if condition false do と書かれている。P145のwhile untilの説明にもtrueとfalseが使われている。 あなたの言いたい事は分かる、というかみんなわかってる。ただ、昔からの習慣をぶった切って何が得なのか分からない。 「条件が真」というのは真偽値とは別の話だよ 条件とセットになってないといけない 何が真かどうかは条件文つまりコマンドによって変わる 値だけをみて真かどうかなんてわからない 例えばexprという条件文は、1(0以外)が真で、0が偽 testという条件文は、文字列の長さがあれば真で、空文字なら偽 だからtestの場合は0も1も真だし、testの演算子を使えば、それに応じて結果も変わる どの値が真か偽かなんてわからない 少なくともexprでは0は偽 >>195-196 つまりスクリプトの文脈や使うコマンドに依存するって事ですよね。それは誰でも知っている。 全てに共通では無いからと言ってif文の話の時ですらtrue falseと言う言い方、表現を認めないと言うのはそれこそ文脈無視。何でそこまでtrue falseを否定するの? >>190 で完全におわってるんだけど何が不満なんだよw >>197 お前がレスしてくるから、返してるだけやで 何が不満なんだよ? 俺も聞きたいわw >ifは正常終了か異常終了かで処理を分岐させるもので >真か偽かで処理を分岐させるものではない そこが普通のプログラミング言語と違うから 混乱することあるよねって話だったんじゃ? >>200 混乱するよな、だったら、そうやな、で終わってた。 ところが、混乱した頭でムリヤリ合理化して、シェルスクリプトとC言語に真偽を融合した大統一理論wを主張されたら、そりゃあ黙ってはおれん。 いや、スルーしてもええんやけど、イジったらおもろいやん? >>184 コマンドの話やったらちゃんと「trueコマンド」って書かんと。 真偽値の話もあるところに単独で「true」とあったら、かならずしもコマンドのことやとは思わんやろ。。。 >>188 誤解のない文章を書けるようになれよ? クソ文を読めない人間の悪口なんか言わんと。 >>202 元々に合わせてのなんだけどな 基本的に元のレスに合わせる感じ、なんか断定的に書いてたりしたら、ひとりごちでわかったように書いてたらw (true/falseってコマンドが真っ先にじゃね?wともあってなあ。シェルスクリプトでtrue/false書くのはコマンドのだし) >真っ先にじゃね?wともあってなあ 真っ先にじゃね?wともあってなあ、「わかるだろ」と親切心w皆無(何故かは書いた通りw)なこともあり てことね >>206 ごめんなさい、fi です。 whileの説明も書き写していたけど長いと思って削除したんですが、その時のミスです。 >>200 Ifに関しては普通のプログラムも真かそれ以外かだと思うけど。 >>208 失礼、プログラムじゃなくてプログラミング言語 >>208 >真かそれ以外か そこに疑問を持った方がいいぞ。真か偽かと書けない時点で >>208 何が真/偽と評価されるかの話に、抽象化された一般論で割り込むな。 >>208 普通のプログラム言語は式が真かそれ以外と評価される シェルスクリプトはコマンドの実行結果が真かそれ以外と評価される 例えば C言語で if (foo(0)) { ... } とあったとき、 0は真だと思うかね?偽だと思うかね? それと同じことだよ Mb >プログラミング言語どころかコンピュータのことすら 理解していない奴が荒らしにきているわけだ。 初心者はもちろん歓迎するのだが、 邪魔する奴は全力でツブす という、怖ろしい連中がいることを肝に銘じてほしい。」 ! [ -n 'これ?' ] [ ! -n 'それともこれ?' ] 好きにだな シェルがやる(汎用)のかコマンドがやる(独自)のかの違い 得られるのは同じ >>220 論理反転できるコマンドなんかあるんか? gitコマンドとかで shでmain関数を定義して ループ内で main & すればサブプロセスで動いてくれてechoしたときの出力も全部表示されるやん? powershellで同じことしたいのにできひんねんけど誰か教えてくれ >>223 Win32コンソールAPIの制限じゃなかったかな WindowsのAPIのスレで聞くといいと思う cshの書籍って何がおすすめですか。 すごく初心者です。 初心者は、cshなんか使わないほうが? BashかPerlのほうが! すごく初心者はいきなりcshとかやらずに コンピュータの仕組みを理解するのが先だと思う ありがとうございます。 linuxは業務で触っていて 基本的なコマンドは知っています。 苦手ではありますが。 ハード屋なのですが c言語、matlab、vba辺りの コードは書いていました。 会社のメンバーが cshで実行するスクリプトを 多用していて理解したり 自分で書いたりする必要が 発生しました。 >>229 メンバーに、Cshからの離脱を提案するべき!w >>232 まさにそれ >>229 そいつのオナニーをやめさせるべき cshスクリプトの中からbashを呼び出せば問題解決だよ! >>230 まさに20代の時にcsh多用してた 今じゃ csh ってまだあったの?という感じだが 40代だけど、Solarisでtcshがログインシェルだったなあ 作業手順書作って、承認受けてから変更作業するタイプのしごとしてて、 ワンライナースクリプトをcshrcに書いてた記憶がある。 帰ったらその頃の資料探してみる 独立したshell scriptを書くには向かないのは同意 Bsh系も、testコマンドのオプション扱いじゃなく、 直感的な == < > <= >= != を使いたいと思うことがある 普段他の言語を書いてて、たまにshを使おうとするといつも一瞬考えてしまう Bashだと = のかわりに == が使えるけど、後は駄目だもんな = もスペースのあるなしで代入と区別するなんてこと忘れてて悩むことしばし >>277 コマンドを使わずにシェルの文法を使えばいいだけ if ((0<10)); then echo ok fi >>236 使ってた本は 技術評論社のThe UNIX Surper Text 上 で、 第29章 csh プログラミング だと思う。 ほかはmanとwebの情報でやってたはず。 csh系はたとえシングルクォートの中でも!はエスケープしないといけないのが注意点かな。 変数の中に入れるときにエスケープはいつでも必須で、 それを使うときにヒストリ置換するならそのままつかい、ヒストリ置換せずに使うなら再度エスケープがいる。 あとは慣れだと思う。 リダイレクト関連はcshだと実現できないことがあったはずで、 それはcshからperl呼んで実質perlスクリプトになってたはず。 >>240 それで思い出したけどcshでシングルクォートだかダブルクォートだか 変数に入れることって出来る? 前に挑戦して挫折したことがあるんだが >>241 シングルクォートを入れたければ、ダブルクォートでくくる。 ダブルクォートを入れたければシングルクォートでくくる。 set hensu="single ' double "'"'" hogehoge" 古いbshもこの方式が必要だったはず。 あれ?できるね?なにで引っかかったんだっけか? 改行文字だったかな? 入れること自体はできるけど、それを使おうとすると Unmatchedが表示されない? 改行+クォートの場合だけ? どうも仕様がよくわからん 昔に何故cshでshell scriptを書くべきでないかという英語文書があって日本語訳もあった 調べたい人は自分で調べてくれ cshの問題点 > 4. クオート > csh ではまともにクオートをすることができません。 これか > 改行をクオートするためにはバックスラッシュを使う必要があり、文字列に含 > めるのは本当に難しいことです。 難しいのか不可能なのかはっきりしてほしいな 不可能なんじゃないのか? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる