シェルスクリプト総合 その30
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトに関する総合スレッドです。 全般 ・荒しは無視しましょう。 ・丁寧な姿勢を心掛けましょう。 ・ネチケット(死語)を意識しましょう。 前スレ: シェルスクリプト総合 その29 https://mevius.5ch.net/test/read.cgi/tech/1537540487/ $@ の中身が printable character だけなら GNU awk の SUBSEP 変数と同じ 様に IFS に '\034'(File Separator) を指定して [ $# -eq 0 ] && exit 0 IFS=$(printf '\034');set -- $(printf "x%sz${IFS}" "$@") IFS=,;echo "$*" とか 訂正 それだと "a b" のように引数にスペースが入ってるときにうまく動かない set -- a "b c" d IFS=$(printf '\034');set -- $(printf "x%sz${IFS}" "$@") IFS=,;echo "$*" とすると xaz,xb cz,xdz となるのだが、そういう事じゃなくて? >>758 うん。だから見落としてたw そうだな。あとはサブシェルを使うから遅いのと、 それよりも、zshだと $ ./test.sh a b c xaz,xbz,xcz, 最後に,がつく ぽじっくすに拘ったりぜっしゅに拘ったり急がしやっちゃなw >>760 Bashとか持ち出すとbash 2.xとか今現在どこでも使われていないバージョンのことも考えないといけなくなるぞw Solarisでさえbash 4なのにw 因みに>>738 や>>739 はset -uしてると引数が存在しない場合に古いシェルで動かない >>759 zsh だと set -- $(printf "x%sz${IFS}" "$@") 後の $# の値が 4 になるのね POSIX 的には $# == 3 になるのが正しい動作なのかね? >>752 訊きたいんだけど, 引数を完全に置き換えてしまうことについてはどう思ってる? 再掲するけど > (問題文に書いてないので推測するしかないが)引数自体はそのまま残したい場合もあるだろうから > 引数を置き換えてしまう方法だと不本意な結果を招くかもしれないとも思った。 引数自体を弄くる方法だとこういうことになるのでは……? >>752 例えば>>738 でIFS=,を使った場合ってどういう挙動になるのが理想なの? >>761 > ぽじっくすに拘ったりぜっしゅに拘ったり急がしやっちゃなw 何いってんの? POSIX互換シェルにこだわってるだけだよ。 POSIXもdashもzshもbashもワケてない POSIX互換シェルという一つのこだわりw >>763 > set -uしてると引数が存在しない場合に古いシェルで動かない 苦笑(知ってるw) 間違ってないが、具体的にどのシェルで動かないか言えるかい? >>764 > POSIX 的には $# == 3 になるのが正しい動作なのかね? めんどくさくて調べてないな。 でもzshだけではなく、今は使われてないだろう古いシェルや とあるシェルの古いバージョンでは4で、後のバージョンでは3になってたりするから おそらく $# == 3 が正しいのだろう。 だが、現実として動かないシェルがある POSIX互換シェルに拘ってるといったが、正確にはPOSIX互換シェルと名乗っている 現実に存在するシェルに拘っているというべきか ZshってPOSIX互換を謳ってたっけ? 少なくとも公式ページ[zsh.org]にはそんな記述は見当らんが…。 もしかしてemulate -R shをPOSIX準拠モードとかだと思ってる…? >>770 いやまって。マジで分からんわw 引数「a b c」を「xaz xbz xcz」にする過程でIFS=,を使う場面なんてあるか? そして仮にあったとして >>713 と>>738 とでその時の挙動に違いがあるとは思えんのだが↓ もしかして 引数「a,b,c」を「xaz xbz xcz」にするとかそういう話か? for i in IFS=, "$@"; do set -- "$@" "x${i}z" shift done echo "$@" こんな風に?w >>762 Solarisは10まで(POSIX互換ではない)Bourne Shellが デフォルトシェルだってのがいただけない Extended Supportが2021年までらしい。 まあ俺はPOSIXじゃないからという理由で切り捨てることにしてるが >>694 > 今回は a b c を xaz,xbz,xcz にしたいから IFS=, を使わなかったわけだが →分かる > それでもIFS=,を使うならばどうすればよいだろうか?→そうだな,どうすればいいんだろう。 > 言い換えると、引き数 a b c を xaz xbz xcz にすればいいわけだが、→え?空白区切り?今IFS=,の話だよな?? > さてどうすればよいだろうか? →???? >>772 >>694 再掲 読める? > 今回は a b c を xaz,xbz,xcz にしたいから IFS=, を使わなかったわけだが > それでもIFS=,を使うならばどうすればよいだろうか? >>774 お前プログラマに向いてないよw 推論能力が圧倒的に不足してる 引数が、xaz xbz xcz の状態なら、IFS使って xaz,xbz,xcz にできるだろw って言っても理解できないんだろうなw >>771 zshのマニュアルにはPOSIXという文字が50個以上存在する これでPOSIXを意識してないとか考えられんわw >>778 Zsh is able to emulate POSIX shells, but its default mode is not POSIX compatible なんて書いてあるから何か変数を設定しないとダメみたいだな 色々弄ってるけど $# が 3 にならんのぅ…ソースコード読むしかないかなw >>780 たぶんその挙動はバグで確定だと思うでw >>768 の質問には答えてくれないのかな? set -uしてると引数が存在しない場合に動かない古いシェルはなにか? >>776 うんだってプログラマじゃねーもんw 寧ろその程度の能力でイキれるお前がプログラマっぽくねぇなw こっちの類推能力も足りんかもしれんが そっちの説明能力もかなり欠如してんぞw >>782 すまんがその前に>>765 に答えてほしい 別にイキってないが、イキってるように見えるのは 俺じゃなくて、お前の問題でしょう? 普通のことなのにお前にはそう見えてしまう。 >>784 何に答えればいいの? 引数を完全に起きかえたいなら置き換えればいいし 置き換えたくないならば、置き換えなければいいだけじゃん なんで>>765 みたいな質問が来るのかを推測したが、 提示したコードはそれで「完成したコード」で そのコードを修正した「応用」は存在しないとか思ってないか? 違うことをしたいならそれに応じて変えればよかろう? >>782 >>786 で一応答えを頂いたので,>>768 への回答をば。 https://www.in-ulm.de/ ~mascheck/various/bourne_args/ ここの These shells behave the old way and need ${1+"$@"}: に色々載ってるぜ 俺が知らないシェルもあって勉強になったわ。 >>785 うーむ。自省という言葉を教えてあげたいw まあある程度シェルスクリプトの能力はありそうだが それ以外が致命的とお見受けするわ……。 ていうかシェルスクリプトの能力ってそんな高める必要ある? >>713 程度が書ければそれで十分。 より高度な,それこそJSONやXMLみたいな階層構造のある 「1行1データ」とは限らない形式のファイルを読み込みたけりゃ, CなりPerlなりを使えばよろしい。 もしくはjqやらxmllintやらで適切に処理して シェルスクリプトに掛ければよろしい。 >>788 それを探してきたかw じゃあそこに書いてない情報を。 poshは<0.10(8年前)ということになってるが、未だ最新版(9ヶ月前)の0.13.2でも修正されていない だから「古いシェル」は実は間違い バグ報告はでてるんだがねぇ posh: set -u prevents using empty argument list Date: Wed, 3 May 2017 12:24:01 UTC Found in version posh/0.12.6 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=861743 posh can not use "$@" together with set -u Date: Wed, 14 Nov 2018 10:00:01 UTC Found in version posh/0.13.2 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=913718 >>789 > ていうかシェルスクリプトの能力ってそんな高める必要ある? 俺がやりたいことを実現するのに必須だったから 自然と高くなっただけ >>789 無駄だろう、最初から偉ぶりたいのが目的なんだから 他人と同等になっただけでも負けとかなんとか思ってるのだろう >>790 うーん。 まあそうなのかもしれないが poshを「無意識に」使ってしまう環境なんてあるのだろうか? 例えば#!/bin/shが/usr/bin/bashにリンクされてる環境であれば, BashのPOSIX互換モード特有のバグには注意しなくてはいけないし, /bin/shの実体が/usr/bin/bashになってる環境は多いので, 多くの利用者が「今 自分が使っている/bin/shが実はBashだ」と意識することなく POSIX shで正しく動く筈のシェルスクリプトを走らせることがあると想定できる。 でもposhが既定で/bin/shにリンクされてたりする環境があるとは思えない…。 >>751 この書き方が分かりやすくて良いと思うんだけど何か問題あるの? >>793 何が言いたいのかわからん。 set -uで動かないシェル(例 posh)があると言い出した(>>763 )のはあんただろ? なんで俺が書いたコードがset -uで動かないと言い出した本人が set -uで動かないシェルを使う環境なんてあるとは思えないって言ってるんだよw 引数を置換するってだけで何をぐだぐだ言ってるんだかw だから>>751 は「引数を置換する」コードになってないだろ? オリジナルの引数を置換するのはプログラマーの本能が止めろと言っているw 普通は置換したもの別の変数に入れて使うよな >>801 そのルールを守りつつ、IFS=,でjoinするというテクニックを使って(必須です。カンマ区切りをするときに使用します) 引数 a b c (例です。引数の内容、個数は変わることがあります)から xaz,xbz,xcz (例です。引数の前後にxとzをつけてカンマ区切りにするという意味です) という出力を得るコードを書くところまでやるのが君の仕事。 それができれば一人前だ! 「POSIX準拠で」をつけ忘れたなw そこまで文脈読めてないやつじゃないだろうが >>804 ? 俺はシェルスクリプトではやらないが、 他の言語で引数を置換するのはやめろというのはわかるから その理屈は間違いじゃないとして、じゃあそれをシェルスクリプトでやるには どうすればいいだろうか?という新たな出題に変えただけだけど? いや、できるでしょ?これ。 もちろんトリッキーなコードになるだろうけど (こういうのこそトリッキーというべきだろう) え? だから>>751 でいいじゃん 何か問題あるのか? >>807 自分でルールを守ってない > 普通は置換したもの別の変数に入れて使うよな >>808 は? だから出力を変数に入れて使えばいいんだろ それから >>751 に関しては 引数をIFS=,でjoinするならばどうすればいいだろうか?という 出題のルールを守ってないよねってことで>>694 に反してる。 >>809 また書くのが遅れたけど、>>751 は>>694 のルールを守ってないのでだめなんだよ。 その話は終わったって言ってるでしょw >>809 「置換したものを別の変数に入れて」使わなければだめ 「出力したものを別の変数に入れる」のは自分で作ったルールに違反してるw 「やりたいこと」は>>694 に書いてあるとおり 「IFS=,でjoinするために引数を置き換える」がやりたいこと(解答はすでに出してる) んで、新しい問題の「やりたいこと」は>>802 に書いてあるとおり 手段が目的化する典型的な例だな そんな縛りプレイに付き合う気になれんな で、後からコード出して こんなのも分からんのか?大したことねえな ってやりたいんだろ? それはな、 その問題がつまらないから誰もやらないんだよw >>798 「コードがset -uで動かない」という発言と 「poshを「無意識に」使ってしまう環境なんてあるのだろうか?」という発言は ほぼ矛盾しないと思うんだけど。 set -uで"$@"が空のとき失敗するシェルはposhだけじゃない。 >>788 で示したリンク先を見てくれ。 なぜかあなたはposhに拘ってるけど(最近になっても解決してないからか?)。 poshに限った話じゃないのに,なぜかposhに限定して話を進めてるから困るわ。 あ,ごめん。ID変わってるけど>>797 とかです。 >>816 あんたはposhが使われる環境があるとは思えないが 古いシェルが使われる環境はあると思ってset -uの話をしたってこと? > bash-4.0.0 ... -4.0.27 > dash-0.4.6 ... -0.4.18 > all ksh88 > ksh93 until release t+20090501 > pdksh-5.1.3, -5.2.14 > mksh before R39 (as pdksh descendant) > posh < 0.10 (as pdksh descendant) > NetBSD 2 ff. /bin/sh > all traditional Bourne shells bash 4.0といえば2009年だね。10年近く前のシェルで動かないからって何? そんなシェルのことまで考えろって言いたかったの? >>815 俺に出されるのが嫌なら、お前が先に出せばいいやんw >>819 問題がつまらないって言ってるだけだ なんで俺が問題出さなきゃならんのよ お題スレでも行けや な?日本語の読解力に問題があるやろ? 俺は>>815 にレスをしていて、その>>815 は > で、後からコード出して と書いてあるように、"出す"のは"コード"という話をしてるのに "問題"を出す話だと勘違いしてくる。 もうね。日本語のレベルでおかしいから、会話にならんのよ。 >>821 お前の言葉が足りないだけだ エスパー期待するなよアホ 足りないなら足りない部分を指摘するべき。 自分で勘違いしておいて、後から足りなかったんだっていうなよw >>818 うん。 だって>>685 でbash 2.xの話をしてるということは 少なくともBashがそのバージョンであった時代くらいまでは考えるべきなんでしょ? OSXのデフォルトシェルがBash3だったはずと思ったら、最新のOSXだとZshになってるんだな ま、LTSの古いOSとか、BSD系だとBash4じゃないのも結構あってまだ動いてると思う 実務だとプログラミングって才能とかよりどれだけ知識を蓄えてるかの方が重要だよね? このスレに居る猛者はどうやって強くなったんすか 才能のないのはまず脱落する。 体力のないのもすぐ脱落する。 あとは下積みあるのみ。 シェルスクリプトの才能ってなに? 驕り高ぶらないこと?w ↑半分本気 シェルスクリプトって5行以内で使うルールで使ってるけど 引数をたくさん使いたいっていう有用なケースってある? >>829 その時代まで考えることと、poshが最新版でも 直ってないことは矛盾しないんだがw >>830 >>2 にも書いてあるが、/bin/shの実体が何かわからん時代になったからな > FreeBSD ユーザーは /bin/sh の実体が ash なので注意。 > Solaris, OpenBSD ユーザーは /bin/sh の実体が ksh なので注意。 > macOS 10.15以降のユーザーは/bin/sh の実体が zsh なので注意。 > android ユーザーは /bin/sh の実体が mksh なので注意。 bashで動けば良いんでしょ?という時代は終わった。 POSIX準拠で書かないと多くの環境で動かない。 >>834 複数ファイルに対して同一の処理をする時。 例えば特定の文字コードに変換するとか。 クロスプラットフォーム必要なケースで、シェルスクリプトで作り込んだりしないよ PerlかPythonか、Windowsも対応するならGoとか使う >>838 逆じゃね? 何かをシェルスクリプトで作ったとして 多くの環境で使うなら、多くの環境で動かんとだめでしょw >>841 例えば組み込み機器でPerlやPythonも入ってない、入れられないときはどうする? シェルスクリプトはかろうじて使える(最初から入ってるから) Goはバイナリがでかいから、空き容量も制限されてる組み込み機器には入れたくない 今はIoT時代ですよ(笑) >>843 シェルスクリプトってすごいんだな そんな組み込みでも走るとは >>844 組み込みLinux用に作られたBusyBoxっていうのがあって、 一つのバイナリに様々な外部コマンド(catとかsedとかwcとか)が詰め込まれてる。 そのBusyboxにashも組み込まれてる。 ただし様々な外部コマンドが組み込まれてるといっても、POSIX完全準拠を 目指しているわけじゃなくて、容量節約のためあまり使われないオプションを実装していない。 それでもシェル(ash)はPOSIX準拠になってる。 BSDなどでもそうなんだが外部コマンドはオプションが違うことがある。 オプションの違いでLinuxで動いたものがMacで動かなかったりするが シェルスクリプトで実装していればそういうこともない。 (Busyboxは組み込み用ではあるが、組み込みLinux用とは限らんかw) (´-`).。oO(IoT機器で文字列くっつけたりTSVファイルを混ぜたりしているのか… そりゃすることもあるだろw IoTはモノのインターネットの略なんだから インターネットにあるものと連携してるよ。 TSVやCSVだけじゃなくJSONやXMLやYAMLも扱いたい (簡易なことならsedなどで対応できるが) やっぱりどこでも動くシェルスクリプトなんて幻想なんだね… (´-`).。oO(心の声に反応しないで欲しい…w >>849 POSIX準拠でシェルスクリプトで書けば可能だって言ってんだろw 今現在でも世界中で書かれているシェルスクリプトの一体何%がPOSIX準拠なのか。 ま、実質幻想だね。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる