シェルスクリプト総合 その29
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトに関する総合スレッドです。 全般 ・荒しは無視しましょう。 ・丁寧な姿勢を心掛けましょう。 ・ネチケット(死語)を意識しましょう。 前スレ: シェルスクリプト総合 その28 http://mevius.5ch.net/test/read.cgi/tech/1532397676/ お約束 ・特記なき場合、Bourne ShellもしくはPOSIX準拠のsh可換シェルが既定です つまりシバンは#! /bin/shです。 他のシェル(bash, zsh, ksh, (d)ash, yash, posh, fish, (t)csh)などの専用機能に依存する場合は明示しましょう。 OS X, GNU/Linuxユーザーは/bin/shの実体がbashなので*特に*注意(自覚なきbashism---シバンが#!/bin/shなのにbashに依存する構文を使っていませんか?)。 ただしDebian, Ubuntuなどでは/bin/shの実体はPOSIX sh互換のdashですのであまり気にしないでも大丈夫です。 FreeBSDユーザーは/bin/shの実体がashなので注意。 Solaris, OpenBSDユーザーは/bin/shの実体がkshなので注意。 csh/tcshでのシェルスクリプトは*まったく推奨しません*。 (参考URL: http://www.speech-lab.org/ ~hiroki/csh-whynot.euc) ・POSIXに準拠しましょう 有用なリンクはhttps://en.wikipedia.org/wiki/POSIX にまとめられています。 最新の仕様はこちらへ: http://pubs.opengroup.org/onlinepubs/9699919799/ (左上の「Shell & Utilities」から各コマンドやファイルの仕様を参照することができます) ・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHeirloom sh、次点でDebianなどに搭載されているDash shell Heirloom sh: http://heirloom.sourceforge.net/sh.html Dash shell: http://gondor.apana.org.au/ ~herbert/dash/ ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります Manページや各種リンク(http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html など)を見ましょう。 apropos(1)ないしはman(1)の-kオプションでそれらしい単語による簡単な検索もできます。 ・ワイルドカードは正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) ・シェルスクリプトのことをシェルってゆうな 初心者へのアドバイス ・適した道具を判断するのも頭の重要な使い方。 シェルスクリプトよりもPerlまたはPythonの方が適した処理にはそちらを使いましょう。 ・知らないコマンドが出てきたらman(1)を引きましょう。 ・思い通りに動かないときは、まずはsh(1)の-xオプションでトレースしましょう。 回答者への注意事項 ・相手がシェルスクリプトでの処理方法を質問しているのにもかかわらず、よく知りもせずに、「そういうのはPerl, Python使え」と回答するのはやめましょう。 安易にPerlやPythonに逃げずに小さなコマンドを組み合わせシェルスクリプトで処理するのが頭のいいやり方。 ・質問に対して問題が間違ってるといちゃもんをつけるのも避けましょう。 次スレを立てる時は>>1 の本文の先頭に以下を追加して下さい。 !extend:on:vvvvv:1000:512 という注意書きを>>1 の先頭に追加してください。 そして注意書きに従ってください。 …回線切って首釣ってくる 回線って言葉の定義によるが、今どきの優先での光とかでも回線とは言う。光回線とかね。 printfのフォーマットについてなんだけど printf '%05d' '33' → 00033 みたいなゼロ埋めってどのシステムでもサポートされているのかな。 %5dみたいな記述はPOSIXの仕様書に在ったから確実だけど ゼロ埋めフラグについて何の言及もしてないっぽいんだよね。 %gとかと違って「実装を要求しない」とも言っていないし。 あ。自決。 よーく読んでもっつーか普通に書いてあったわ。 >>11 なんて書いてあった? シェルのバージョンによっては8進数しか 受け付けなかったりするんだよねー シェルスクリプトで数値を扱うのがおかしい。シェルスクリプトは文字として認識しているから、もともと数値の取り扱いは気をつけないといけない。 そんな事言われましても、シェルスクリプトに 数値計算の機能がありますし >>16 シェルスクリプトそのものにはもともと計算機能は存在しないよ。 shは計算コマンドでの対応しかできない。 >>14 なんか勘違いしてね? 俺が言ってるのは0フラグ。 pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html#tag_20_94_13 ちなみにprintf '%b' '\0ddd'はPOSIXでは8進数しか定められてない のでその「8進数しか受け付けない」システムは正当。 >>17 $(())があるじゃない exprやbcはまあコマンドだけど。 今のシェルスクリプトの話をしろよ 需要に応じて変わるんだよ 〃〃∩ _, ,_ ⊂⌒( つД´) < ヤダヤダ `ヽ_ ノ ⊂ノ ジタバタ exprは(シェルによるけど)grepみたいな正規表現が単語に対して使えるからすごく重宝してた。 でも最近はそもそもそういう非可搬な機能を使うならbashの[[ <str> ~= "/regexp/" ]]でいいやってなってる。 そっちには特定のOSでしか動かないで存在しないのが入ってるからじゃね。特定のOSの板かスレが相応しいのだろう ああ、特定のOSでしかでもないのか。じゃ、すでに専用スレあるのでってとこか。言葉が違うのに混ぜることもないだろしな 受け取った文字列が想定しているものかを判定する場合で 「特定の種類の文字のみ構成されている」かを調べる方法として ↓こういうのを考えてみた test "$VAR" = "${VAR#*[^a-z]}" 成功したらVARは[a-z]のみで構成されているということ。 あと一応POSIX 2018にも準拠してる。 grep(1)などを用いて処理するより早いと思うんだが 最近のPCは処理が速すぎて今一違いが分からんw case $VAR in *[^a-z]*) ;; # a-z以外の文字がある *) ;; # a-zのみで構成 esac でいいやろ? 置換処理しないから更に速いはず foo() { echo 1 echo echo echo } a="$(foo)" echo "$a" ってやったら、最後に改行がいくつあっても消えちゃうんだけどさ aに改行ごと入れる方法ない?bash依存なしで >>32 a="$(foo; echo @)" a="${a%@}" $ ( a="a,,b,,c"; IFS=","; set -- $a; echo $3; ) b $ ( a="a b c"; IFS=" "; set -- $a; echo $3; ) c なんでや? 空(くう)を理解出来ないタイプの馬鹿って結構いるんだよな スペース か カンマ かによって 挙動が違うっておかしいだろ わざわざそうしてるってなんで理解できないんだろかな >>40 別人だからな。なんで同一視してんのかわからんな あぁ、ブラウザで見るとスペースが1個になるのねw $ ( a="a<カンマ2個>b<カンマ2個>c"; IFS=","; set -- $a; echo $3; ) b $ ( a="a<スペース2個>b<スペース2個>c"; IFS=" "; set -- $a; echo $3; ) c これで意味分かるやろ? <カンマ2個>は ,, のこと <スペース2個> も同様 やっぱり、元のヤツか。>>40 といい独特というか視野が狭いというか思考理解力が狭いな >>36 が答えでもう終わってるだろうに シェルスクリプトにヒアドキュメントって "HERE" でも 'HERE' でも変数展開行われないのか・・・ "HERE" は HERE と同じだと思っていた >>47 シェルスクリプトだけじゃなくて、他の言語も勉強するといいですよ > If no part of word is quoted, all lines of the here-document shall be expanded for parameter expansion, command substitution, and arithmetic expansion. http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04 \HERE とか HE"R"E とか ""HERE でもいいんだな a = <<"EOT" あ EOT Ruby では、" " なら、バックスラッシュ・式展開が使える。 ' ' なら使えない ヒアの中身の話をしてるんじゃないのか? なんだかrubyとかやってる人ってとんちんかんな人多いよなあ >>47 に対して>>48 の意味が>>51 だったてことだろ。意地はるなみっともない >>53 ますます意味不明 なんでルビーがでてくるし? あー、もしかして、ヒアドキュメントが 他の言語にもあるって知らない人かな? もう少し勉強したほうが良いよ この件は別に他の言語での知識経験から故にで全然おかしくないだろう 単にそう思ったのはそうだったのかで済む話でしかないだろうに。何を拘っているんだか 環境によって頭を切り替えられない馬鹿だという告白ってこと? それならまあ納得なのだが。 なにを言っているんだか。単に「よく」調べないで経験則で思い込んでいたってだけだろう。そういう人もいてもおかしくはないだろう 誰かのように、どうも最初から馬鹿にしたいだけなら違うんだろうけどな 「普通は」他の言語の知識があるわけで、 他の言語がそうだったから、シェルスクリプトでもそうだと 思ったのに違っていて驚いたってだけの話だろ なんで言語が変わったら、0から言語仕様を勉強します。 以前の言語の知識は全て捨てて、最初から学び直しますってなるんだ? 文法は「知らない」 or 「間違いなく知ってる」 のどちらかしか無いはずなんです。 「他の言語がそうだったから、同じだろう」なんて思うやつなんてありえないんです。 そう考えてるのか?そんなやついないだろ。 /\___/\ / / ヽ ::: \ | (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ,,ノ(、_, )ヽ、,, | < まーたはじまった | ,;‐=‐ヽ .:::::| \_______ \ `ニニ´ .:::/ /`ー‐--‐‐―´´\ たかが>>46 の独白(?)に何をそんなに必死になっているんだか 何かが気に食わなかったのだろうな>>46 のレスの内容ではなくて 1. シェルスクリプトの仕様に文句言われて悔しい 2. 俺にとっての常識が、井の中の蛙だとばれて悔しい どっちか いやいやw君がなんだか。なにその読めなさはwずっと同じ人? >>63 3.おまえがバカを晒して悔しい だろう? >>66 えーっ、おれが馬鹿を晒してしまったやんけっ なにを長文で、わかりづらいネチっこい最後の部分。あんたのスタンスなんぞがわかっているのが居るんだからなにをわざわざな...もう まあ、すまんかった、いろいろと 理由が書いてないものに意味はないよ。 ばーかばーかっていってるのと同じだからね Rubyさいこおおおおおおお シェルはほろびろおおおお やれやれ、延長戦か。昨日ので終わってれば普通のまともな人に見えたのに。 ジョブって使ったことあります? fgとかbgぐらいはあると思うんですが、 そういうのってコマンドラインじゃなくて シェルスクリプトで使うことって考えられますかね? 俺はないけど 単に経験が浅いだけかも知れない ただ,似非の非同期処理として,ネットワーク資源をwgetなんかで取得しているジョブと同時に その資源に依存しない種々の作業を同時に実行して, その資源が必要になった段階でwaitコマンドでwgetの終了を待つ, みたいなことはよくやる。 USR1シグナルって受け取ったら trapしてても死んじゃうの? いいや シグナルに対してハンドラが無い場合死ぬのであって、trapしてんだか死なない いや死ぬんだが? これ実行してみ [main.sh] #!/bin/sh trap 'echo USR1' USR1 for i in $(seq 1 10); do ./child.sh "$$" & done wait [child.sh] #!/bin/sh sleep 0.1 kill -USR1 "$1" ただの正常終了、main.sh処理全部終わりましたでしょがー 意図した動きになるようには書いてないだけでしょう >>77 実行すらしてないようだから、実行結果書いておきますねw $ ./main.sh USR1 USR1 $ ./child.sh: 4: kill: No such process ./child.sh: 4: kill: No such process ./child.sh: 4: kill: No such process ./child.sh: 4: kill: No such process ./child.sh: 4: kill: No such process ./child.sh: 4: kill: No such process なにそれ。性根の悪いヤツだな man bashでwait及びシグナルんとこ読みなさい >>79 はいどうぞ。 wait [n ...] n が与え られていない場合には、現在アクティブな全ての子プロセスを wait し、 返却ステータスは 0 となります。 疑問点があれば受け付けますよ? なんか続きそうでメンドくさくなった ただの正常終了、「main.sh処理全部終わりました」 だよ。 wait じゃなくて until wait do : done とかだろう。どう意図した動きにしたいのか知らんけど、間違いは マジで性根の悪いヤツだった。言ったことやってから言えよな、もう 「シグナルんとこ読みなさい」だよ。くそがw よく笑ってるな。まじでなんなん?ただのプライドが高いアレか どこまで本気なのかなあ。 小学生が頭の悪そうななぞなぞで得意がってるとか、そういう雰囲気を感じる。 とりあえず 「シグナルで死んだんなら、なんで echo が実行されてんだよ!」 とつっこんでおくよ。 シグナルで死んでるんじゃなくて全てのプロセスが終了する前に wait から抜けちゃうってことだな。 理由はシグナル受け取っているからだが。 Ruby のSignal モジュールを使え 割り込み : Ctrl + C Signal.trap("INT") { |signo| puts Signal.signame(signo) } Process.kill("INT", 0) for i in *; do echo "$i" done これって必ずソートされるの? へー、取得したいのは最初の一個だけでいいんだけど、 その最初の一個は、小さいものになるんか というか、一個だけ取得する速い方法ないかな? でもソートしてるなら、結局内部で全部読み込むのか? 1.txt, 2.txt, 3.txt と3つファイルがあるディレクトリでecho * したら これらのファイルがでてくるのに空のディレクトリで、 echo * したら * と表示されるのなんで? 何も表示されないでほしいんだけど、この仕様、なにか便利なの? エコーさんはね、もらったものをエコーするだけだってね、ママがいってたの ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.0 2024/04/24 Walang Kapalit ★ | Donguri System Team 5ちゃんねる