シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
前スレ: シェルスクリプト総合 その27(https://mevius.5ch.net/test/read.cgi/unix/1525337663/)
シェルスクリプト総合 その28
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2018/07/24(火) 11:01:16.36ID:r0TJj2hB665612
2018/09/04(火) 21:24:00.90ID:GKTPwsNb >>664
500行を越えるぐらいからかな。
常にその原則を守ってるわけでもなくて、不特定ユーザーに配布するスクリプトではBourne shellで3000行ぐらいのをメンテしてたりもする。
これは規模的に結構辛い。orz
言語は最近はCrystalを試してる。
まだ書き慣れたって段階には達してないけど。
500行を越えるぐらいからかな。
常にその原則を守ってるわけでもなくて、不特定ユーザーに配布するスクリプトではBourne shellで3000行ぐらいのをメンテしてたりもする。
これは規模的に結構辛い。orz
言語は最近はCrystalを試してる。
まだ書き慣れたって段階には達してないけど。
666デフォルトの名無しさん
2018/09/04(火) 21:57:53.47ID:wTvbP50/ >>665
俺は数百行って聞くと2、300をイメージするから、どのぐらいか気になった
crystalとは・・・俺は1.0も出てないものは使えんなあ
うちは処理結果が揮発で良いなら基本bash/pythonを使ってる
俺は数百行って聞くと2、300をイメージするから、どのぐらいか気になった
crystalとは・・・俺は1.0も出てないものは使えんなあ
うちは処理結果が揮発で良いなら基本bash/pythonを使ってる
667デフォルトの名無しさん
2018/09/04(火) 22:13:29.28ID:ROt4XEkp >>659
やっぱり矛盾してるじゃんw
1. 俺、数百行クラスになったら静的言語にするから、シェルスクリプトどころかrubyもpythonも使わない。
2. 短いプログラムは、シェルスクリプトやruby/pythonなど動的型付き言語で書くことが多い
3. 拡張していくうちに、これ以上長くなったら静的型付き言語で書いた方が楽そうだと思ったら、まるまる静的型付き言語で書き直す。
では、長くならない場合は?
シェルスクリプトやrubyもpythonを使うんだろw
やっぱり矛盾してるじゃんw
1. 俺、数百行クラスになったら静的言語にするから、シェルスクリプトどころかrubyもpythonも使わない。
2. 短いプログラムは、シェルスクリプトやruby/pythonなど動的型付き言語で書くことが多い
3. 拡張していくうちに、これ以上長くなったら静的型付き言語で書いた方が楽そうだと思ったら、まるまる静的型付き言語で書き直す。
では、長くならない場合は?
シェルスクリプトやrubyもpythonを使うんだろw
668デフォルトの名無しさん
2018/09/04(火) 22:15:09.44ID:ROt4XEkp >>665
> 常にその原則を守ってるわけでもなくて、不特定ユーザーに配布するスクリプトではBourne shellで3000行ぐらいのをメンテしてたりもする。
小さく分けようぜw
ファイルを分けたり、関数にすりゃ、
たった3000行なんて十分メンテ可能だろ
> 常にその原則を守ってるわけでもなくて、不特定ユーザーに配布するスクリプトではBourne shellで3000行ぐらいのをメンテしてたりもする。
小さく分けようぜw
ファイルを分けたり、関数にすりゃ、
たった3000行なんて十分メンテ可能だろ
669デフォルトの名無しさん
2018/09/04(火) 22:15:31.25ID:dB7ca3M3 やはりワッチョイいるな
670デフォルトの名無しさん
2018/09/04(火) 22:18:59.76ID:ROt4XEkp >>663
> まさかシェルスクリプトスレでオブジェクト指向のクラスのことだと解釈されるとは思わなかった。
自分でrubyやpythonも使わないって言ったんだろw
自分でオブジェクト指向の言語だしといて何いってんだよ
結局最初に予測したとおり、大きな(それほど大きくもないがw)
プログラムを作るときの、小さなモジュールで作るってことを知らないだけじゃん
> まさかシェルスクリプトスレでオブジェクト指向のクラスのことだと解釈されるとは思わなかった。
自分でrubyやpythonも使わないって言ったんだろw
自分でオブジェクト指向の言語だしといて何いってんだよ
結局最初に予測したとおり、大きな(それほど大きくもないがw)
プログラムを作るときの、小さなモジュールで作るってことを知らないだけじゃん
671612
2018/09/04(火) 22:45:12.74ID:GKTPwsNb >>667
> では、長くならない場合は?
> シェルスクリプトやrubyもpythonを使うんだろw
勿論そうだよ。
> やっぱり矛盾してるじゃんw
> 1. 俺、静的言語にするから、シェルスクリプトどころかrubyもpythonも使わない。
「シェルスクリプトどころかrubyもpythonも使わない」ってのが「数百行クラスになったら」に限定された記述だってことに気づかないあたりが君の鈍いところ。
初見で気づかないのはまあ元の文が多義的に解釈できるから仕方ないとしても、
この期に及んで気づいてないのは致命的かな。
> では、長くならない場合は?
> シェルスクリプトやrubyもpythonを使うんだろw
勿論そうだよ。
> やっぱり矛盾してるじゃんw
> 1. 俺、静的言語にするから、シェルスクリプトどころかrubyもpythonも使わない。
「シェルスクリプトどころかrubyもpythonも使わない」ってのが「数百行クラスになったら」に限定された記述だってことに気づかないあたりが君の鈍いところ。
初見で気づかないのはまあ元の文が多義的に解釈できるから仕方ないとしても、
この期に及んで気づいてないのは致命的かな。
672612
2018/09/04(火) 22:52:14.96ID:GKTPwsNb673デフォルトの名無しさん
2018/09/04(火) 23:01:52.48ID:ROt4XEkp >>672
(全てのプログラムは)長くなるからシェルスクリプトどころかrubyもpythonも使わない
って言っただろ?
長くならないプログラムがあって
「その場合はシェルスクリプトやrubyもpythonを使ってる」というのなら、
明らかな矛盾。使わないと言っておきながら使ってると言ってる。
>>671
負担が大きいから何だって言うんだ?
負担の大小ではなく、管理可能かどうかだろ
現実見てみろ。動的言語でも全体で何万行もあるシステムは作れている
お前が作れないのは単にお前の能力不足でしかない
その事に気づいたようで、動的言語では作れないんだというニュアンスから
負担が大きいに言い換えたようだが、バレバレだw
最初(>>623)に言っておいたとおり、プロジェクト全体の行数を考えるのは意味がない
> 小さなモジュールを組み合わせて作るんだから、プロジェクト全体の行数で考えるのは意味ないんだよ。
小さいモジュールのあつまりで作ればいいだけの話
小さいモジュールの集まりで作るから、
> 小さなプログラム、小さなファイル、小さなクラス、小さな関数等
は長くならない
(全てのプログラムは)長くなるからシェルスクリプトどころかrubyもpythonも使わない
って言っただろ?
長くならないプログラムがあって
「その場合はシェルスクリプトやrubyもpythonを使ってる」というのなら、
明らかな矛盾。使わないと言っておきながら使ってると言ってる。
>>671
負担が大きいから何だって言うんだ?
負担の大小ではなく、管理可能かどうかだろ
現実見てみろ。動的言語でも全体で何万行もあるシステムは作れている
お前が作れないのは単にお前の能力不足でしかない
その事に気づいたようで、動的言語では作れないんだというニュアンスから
負担が大きいに言い換えたようだが、バレバレだw
最初(>>623)に言っておいたとおり、プロジェクト全体の行数を考えるのは意味がない
> 小さなモジュールを組み合わせて作るんだから、プロジェクト全体の行数で考えるのは意味ないんだよ。
小さいモジュールのあつまりで作ればいいだけの話
小さいモジュールの集まりで作るから、
> 小さなプログラム、小さなファイル、小さなクラス、小さな関数等
は長くならない
674デフォルトの名無しさん
2018/09/04(火) 23:05:52.86ID:ROt4XEkp シェルスクリプトの話に戻すならば、
頭が固い人のたわごとは無視して、
複数のファイルで作れば良いってことなんだよ
もちろん、100行のコードと、
100行の10個のファイルだと後者のほうが
複雑だが(そりゃコード量が増えてるからな)
100行の10個のファイルの動的言語と
100行の10個のファイルの静的言語の
複雑度は変わらない
頭が固い人のたわごとは無視して、
複数のファイルで作れば良いってことなんだよ
もちろん、100行のコードと、
100行の10個のファイルだと後者のほうが
複雑だが(そりゃコード量が増えてるからな)
100行の10個のファイルの動的言語と
100行の10個のファイルの静的言語の
複雑度は変わらない
675デフォルトの名無しさん
2018/09/04(火) 23:06:43.34ID:ROt4XEkp 行とかいたら、コメント含めたりするかw
一応実行行(ステップ数)と言い換えておく
一応実行行(ステップ数)と言い換えておく
676デフォルトの名無しさん
2018/09/04(火) 23:14:44.94ID:RaX7EawA この話オチあるんか?
677デフォルトの名無しさん
2018/09/04(火) 23:17:47.09ID:ROt4XEkp678デフォルトの名無しさん
2018/09/04(火) 23:20:18.74ID:ROt4XEkp C言語に連想配列はなくても、誰かが作ったライブラリはある
そう考えると>>571の結論に戻る
> まとめると、現在のシェルスクリプトが大規模開発に向いてないのは
> フレームワークやライブラリが不足しているから。
> 俺がシェルスクリプトで大規模開発をやらないのは、
> シェルスクリプトが適した内容で大規模なものを思いつかないから。
> それはそれとして中規模を小規模にするためのフレームワークやライブラリは欲しい。
そう考えると>>571の結論に戻る
> まとめると、現在のシェルスクリプトが大規模開発に向いてないのは
> フレームワークやライブラリが不足しているから。
> 俺がシェルスクリプトで大規模開発をやらないのは、
> シェルスクリプトが適した内容で大規模なものを思いつかないから。
> それはそれとして中規模を小規模にするためのフレームワークやライブラリは欲しい。
>>678
>誰かが作ったライブラリはある
それは具体的にどこにあるのですか?
それを見つけたとして、それを自分のプログラムに適用できるかどうか判断できるのですか?
単に(論理的に)存在すること、だけを言及しても意味がないと思いますけれども
>誰かが作ったライブラリはある
それは具体的にどこにあるのですか?
それを見つけたとして、それを自分のプログラムに適用できるかどうか判断できるのですか?
単に(論理的に)存在すること、だけを言及しても意味がないと思いますけれども
680デフォルトの名無しさん
2018/09/04(火) 23:26:38.84ID:ROt4XEkp C言語用連想配列の話?
681デフォルトの名無しさん
2018/09/04(火) 23:27:47.89ID:ROt4XEkp http://d.hatena.ne.jp/fd0/20080419/p1
glibc
言わずと知れた GNU の標準 C ライブラリ。search.h というヘッダがあり、
その中にハッシュテーブルを管理できる API が提供されている。
glibcなら誰でも知ってるだろう
glibc
言わずと知れた GNU の標準 C ライブラリ。search.h というヘッダがあり、
その中にハッシュテーブルを管理できる API が提供されている。
glibcなら誰でも知ってるだろう
682612
2018/09/04(火) 23:29:35.30ID:GKTPwsNb >>673
どうも君は健忘症みたいだから>>612から引用してあげるね。
> 俺、数百行クラスになったら静的言語にするから、シェルスクリプトどころかrubyもpythonも使わない。
「数百行クラスになったら」って書いてますね...
相手の発言を確認せずに「全てのプログラムは」とか言っちゃうの、仕事でやったら信用失うから今後は気をつけた方がいいと思うよ。
> 静的型検査なしで書くのは面倒くさい。
はい、「動的言語では作れないんだというニュアンス」なんて全くないですね。
動的言語だと「面倒くさい」って書いてるだけでした。
仕事でもこんな調子でコミュニケーションしてるのかなあ。
> 小さいモジュールの集まりで作るから、
せっかく「まったく同じようにモジュール化しても、静的型付き言語に比べて動的型付き言語は人間にかかる負担が大きい」って書いてあげたのに読めてないんだね。
モジュール粒度が同じでも、動的型付き言語と静的型付き言語では、人間の負担するコストに違いがあるんですよ。
どうも君は健忘症みたいだから>>612から引用してあげるね。
> 俺、数百行クラスになったら静的言語にするから、シェルスクリプトどころかrubyもpythonも使わない。
「数百行クラスになったら」って書いてますね...
相手の発言を確認せずに「全てのプログラムは」とか言っちゃうの、仕事でやったら信用失うから今後は気をつけた方がいいと思うよ。
> 静的型検査なしで書くのは面倒くさい。
はい、「動的言語では作れないんだというニュアンス」なんて全くないですね。
動的言語だと「面倒くさい」って書いてるだけでした。
仕事でもこんな調子でコミュニケーションしてるのかなあ。
> 小さいモジュールの集まりで作るから、
せっかく「まったく同じようにモジュール化しても、静的型付き言語に比べて動的型付き言語は人間にかかる負担が大きい」って書いてあげたのに読めてないんだね。
モジュール粒度が同じでも、動的型付き言語と静的型付き言語では、人間の負担するコストに違いがあるんですよ。
683612
2018/09/04(火) 23:32:47.66ID:GKTPwsNb search.h のハッシュ関数は別にglibc依存じゃなくてPOSIXだよ。
日頃POSIX POSIX言ってるけど、シェルスクリプトの範囲しか知らない人かな。
日頃POSIX POSIX言ってるけど、シェルスクリプトの範囲しか知らない人かな。
684デフォルトの名無しさん
2018/09/04(火) 23:33:18.38ID:ROt4XEkp >>682
> 「数百行クラスになったら」って書いてますね...
だから矛盾してるんだよ。
「条件付きの結論」っていうのは、その結論(シェルスクリプトやRubyやPythonを使わない)が
正しいのはあくまで条件を満たされている場合であって
条件を満たさなければ、シェルスクリプトやRubyやPythonを使うということになる
> 「数百行クラスになったら」って書いてますね...
だから矛盾してるんだよ。
「条件付きの結論」っていうのは、その結論(シェルスクリプトやRubyやPythonを使わない)が
正しいのはあくまで条件を満たされている場合であって
条件を満たさなければ、シェルスクリプトやRubyやPythonを使うということになる
685デフォルトの名無しさん
2018/09/04(火) 23:34:16.08ID:ROt4XEkp >>683
> search.h のハッシュ関数は別にglibc依存じゃなくてPOSIXだよ。
いつ俺がPOSIXじゃないって言ったんだ?
「glibcで提供している」と書いてあるブログを持ってきただけだろ
> search.h のハッシュ関数は別にglibc依存じゃなくてPOSIXだよ。
いつ俺がPOSIXじゃないって言ったんだ?
「glibcで提供している」と書いてあるブログを持ってきただけだろ
686デフォルトの名無しさん
2018/09/04(火) 23:34:31.63ID:ROt4XEkp ほんとどうでもいいところにばっかり突っ込むよなw
687デフォルトの名無しさん
2018/09/04(火) 23:36:12.99ID:idomDZwg お前がな
688デフォルトの名無しさん
2018/09/04(火) 23:36:56.71ID:ROt4XEkp >>682
> せっかく「まったく同じようにモジュール化しても、静的型付き言語に比べて動的型付き言語は人間にかかる負担が大きい」って書いてあげたのに読めてないんだね。
> モジュール粒度が同じでも、動的型付き言語と静的型付き言語では、人間の負担するコストに違いがあるんですよ。
だから、負担が大きいが、別に作れるだろって話
お前は極端なんだよ。規模が大きくなったときのことで悩んで、負担が大きいから使わないと
規模を大きくしなければ済む話なのに、それに気づいていない
まあ行数が同じなら、負担なんて大して変わらんがね。
動的型付き言語で大変なら、静的型付き言語でも大変
> せっかく「まったく同じようにモジュール化しても、静的型付き言語に比べて動的型付き言語は人間にかかる負担が大きい」って書いてあげたのに読めてないんだね。
> モジュール粒度が同じでも、動的型付き言語と静的型付き言語では、人間の負担するコストに違いがあるんですよ。
だから、負担が大きいが、別に作れるだろって話
お前は極端なんだよ。規模が大きくなったときのことで悩んで、負担が大きいから使わないと
規模を大きくしなければ済む話なのに、それに気づいていない
まあ行数が同じなら、負担なんて大して変わらんがね。
動的型付き言語で大変なら、静的型付き言語でも大変
690デフォルトの名無しさん
2018/09/04(火) 23:40:26.52ID:ROt4XEkp お前がな
691デフォルトの名無しさん
2018/09/04(火) 23:41:11.31ID:gZnu4stV 隔離病棟はものすごいことになってる
692デフォルトの名無しさん
2018/09/04(火) 23:41:41.00ID:ROt4XEkp693デフォルトの名無しさん
2018/09/04(火) 23:42:22.29ID:+CEwKGA5 元の板に戻ったほうが良いんじゃないかな
694デフォルトの名無しさん
2018/09/04(火) 23:42:47.42ID:Gq1Hay5m キチガイに触んなすな
695612
2018/09/04(火) 23:43:57.27ID:GKTPwsNb いや、IDがないともっと悲惨だよ、これ。
次スレはワッチョイもつけた方がいい気がする。
次スレはワッチョイもつけた方がいい気がする。
696デフォルトの名無しさん
2018/09/04(火) 23:44:19.45ID:ROt4XEkp698デフォルトの名無しさん
2018/09/04(火) 23:46:10.08ID:gZnu4stV 懸命に手を尽くしたましたが
手の施しようがありません
手の施しようがありません
699デフォルトの名無しさん
2018/09/04(火) 23:47:02.77ID:ROt4XEkp >>695
ワッチョイついてるスレでの俺の活躍を見よ(笑)
Git 16©2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1502726047/458-
ワッチョイついてるスレでの俺の活躍を見よ(笑)
Git 16©2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1502726047/458-
700612
2018/09/04(火) 23:47:07.77ID:GKTPwsNb やっぱり前スレの荒らしおよび、UNIX 板で後から意図的に重複スレ立てた人物だったんだね。
まあそうだろうとは思ってはいたが。
まあそうだろうとは思ってはいたが。
701デフォルトの名無しさん
2018/09/04(火) 23:48:37.75ID:ROt4XEkp >>700
ひどいな。ネタに決まってるじゃないか
ひどいな。ネタに決まってるじゃないか
702デフォルトの名無しさん
2018/09/04(火) 23:50:01.24ID:gZnu4stV なるほどサマータイムスレであばれた低学歴知恵遅れの一部で
マジキチだったヤツか
マジキチだったヤツか
703デフォルトの名無しさん
2018/09/04(火) 23:50:48.48ID:zILy+Zrq 迷惑なスレの乱立は
ID:ROt4XEkp の仕業だったんだな
ID:ROt4XEkp の仕業だったんだな
704デフォルトの名無しさん
2018/09/04(火) 23:50:57.04ID:ROt4XEkp それは半角使うやつだろ
はっ!お前半角使ってるじゃん!
はっ!お前半角使ってるじゃん!
705612
2018/09/04(火) 23:51:43.34ID:GKTPwsNb 福岡県かあ。関東かと思ってたが違ったんだな。
707デフォルトの名無しさん
2018/09/04(火) 23:55:45.20ID:ROt4XEkp >>705
実はもう一つプロバイダ持ってるw
そっちはホスト名調べても県名がでない
予備回線で昔(10年以上前)は大手プロバイダでも時々回線異常発生してたんで
持ってたんだけど、最近は使わないからやめようかと思ってるけどね
もう2ちゃんねるでスレ立てるするときにしか使ってないしw
実はもう一つプロバイダ持ってるw
そっちはホスト名調べても県名がでない
予備回線で昔(10年以上前)は大手プロバイダでも時々回線異常発生してたんで
持ってたんだけど、最近は使わないからやめようかと思ってるけどね
もう2ちゃんねるでスレ立てるするときにしか使ってないしw
708デフォルトの名無しさん
2018/09/04(火) 23:56:24.91ID:ROt4XEkp んで、元の板に戻るのかどうか?
俺はどっちでもいいよ
俺はどっちでもいいよ
709デフォルトの名無しさん
2018/09/04(火) 23:58:49.53ID:ROt4XEkp ワッチョイ板でも書いたけど日付変わったらIPアドレス変更するよ!
攻撃しないでね!(まあやっても無駄だけど)
攻撃しないでね!(まあやっても無駄だけど)
710デフォルトの名無しさん
2018/09/04(火) 23:59:32.47ID:ROt4XEkp (まあIPアドレス変わっても書き込み内容が独特なのでストーキングしていればすぐに分かる)
711612
2018/09/05(水) 00:01:43.69ID:D7naH2YM これだけ荒らしておいて、まだUNIX板に戻る選択肢があると思ってるとは...
絶対に戻らないっことが、今回の
件でさらに強固になっただけだね。
そして ID:+CEwKGA5 はもう一つのプロバイダーを使った自演だったというわけだ。
絶対に戻らないっことが、今回の
件でさらに強固になっただけだね。
そして ID:+CEwKGA5 はもう一つのプロバイダーを使った自演だったというわけだ。
712デフォルトの名無しさん
2018/09/05(水) 00:05:18.62ID:NuDqxS96 疑心暗鬼(笑)
713デフォルトの名無しさん
2018/09/05(水) 00:33:48.24ID:uppndDPA まず馬鹿ガイキチには叶わないっていう如実なサンプルってことで、以後ID:ROt4XEkp とわかったら途中でも終了スルーでいいだろう
714デフォルトの名無しさん
2018/09/05(水) 03:10:59.07ID:mw/V56zA 元に戻るってのはID無くすってことだぞ
全く解決になってない
解決ってのはワッチョイなりIPなり表示させることだ
全く解決になってない
解決ってのはワッチョイなりIPなり表示させることだ
715デフォルトの名無しさん
2018/09/05(水) 09:56:32.93ID:NuDqxS96 a="abc" から最初の一文字を削除するのは
echo "${a#?}" でいけますが、
この削除した文字を取得する方法ってないですよね?
echo "${a#?}" でいけますが、
この削除した文字を取得する方法ってないですよね?
716デフォルトの名無しさん
2018/09/05(水) 10:20:06.92ID:04P6tucf717デフォルトの名無しさん
2018/09/05(水) 10:33:50.47ID:NuDqxS96 bashはまあそれでいけますよね・・・
試しに文字列の長さを測って
(ループで空になるまで1文字ずつ消していけばわかる)
文字列の長さ-1個の??????・・・という文字列を作って
${a%????・・・} で文字列の後ろを削って1文字残す
というやり方でevalも駆使して取り出したけど、
このやり方で1文字ずつループさせたら
1KB程度の文字列で1秒かかってしまったw
これならたぶんsedで1文字ずつ改行させて処理したほうが速いだろうな
試しに文字列の長さを測って
(ループで空になるまで1文字ずつ消していけばわかる)
文字列の長さ-1個の??????・・・という文字列を作って
${a%????・・・} で文字列の後ろを削って1文字残す
というやり方でevalも駆使して取り出したけど、
このやり方で1文字ずつループさせたら
1KB程度の文字列で1秒かかってしまったw
これならたぶんsedで1文字ずつ改行させて処理したほうが速いだろうな
718デフォルトの名無しさん
2018/09/05(水) 10:34:25.02ID:NuDqxS96 >>716
ついでに聞きたいんだけど、手元にkshしかない状況ってどんな状況?
ついでに聞きたいんだけど、手元にkshしかない状況ってどんな状況?
719デフォルトの名無しさん
2018/09/05(水) 10:36:03.21ID:04P6tucf >>718
仕事中
仕事中
720デフォルトの名無しさん
2018/09/05(水) 10:36:40.11ID:jCw2sC+8 ${a%${a#?}}
でいいのかな。dashでもとれてそう
でいいのかな。dashでもとれてそう
721デフォルトの名無しさん
2018/09/05(水) 10:40:24.63ID:04P6tucf お、kshでも取れたわ
なるほど
なるほど
722デフォルトの名無しさん
2018/09/05(水) 10:48:45.20ID:NuDqxS96723デフォルトの名無しさん
2018/09/05(水) 10:51:17.41ID:04P6tucf >>722
あぁ、AIXだよ
あぁ、AIXだよ
724デフォルトの名無しさん
2018/09/05(水) 10:51:44.08ID:NuDqxS96 >>720
それでもいけるように見えるんだけど
aの中にa*bとか入れてみたら動かない
動くパターン
a="abc"
echo "${a%${a#?}}"
=> a
動かないパターン
a="a*b"
echo "${a%${a#?}}"
=> a*
それでもいけるように見えるんだけど
aの中にa*bとか入れてみたら動かない
動くパターン
a="abc"
echo "${a%${a#?}}"
=> a
動かないパターン
a="a*b"
echo "${a%${a#?}}"
=> a*
725デフォルトの名無しさん
2018/09/05(水) 10:52:39.04ID:NuDqxS96 >>723
なるほど。そっち系はよくわからないな。
なるほど。そっち系はよくわからないな。
726デフォルトの名無しさん
2018/09/05(水) 11:14:09.22ID:jCw2sC+8 特殊文字かあ。 ' で括ってで問題なさげ
${a%'*b'}
なので、こうかな
eval 'b=${a%'"'${a#?}'}"
${a%'*b'}
なので、こうかな
eval 'b=${a%'"'${a#?}'}"
727デフォルトの名無しさん
2018/09/05(水) 11:18:19.46ID:jCw2sC+8 ああ、今度は ' が邪魔か。sedで
728デフォルトの名無しさん
2018/09/05(水) 11:22:08.23ID:04P6tucf 変数展開にこだわると特殊文字がきついな
eval容認するならもうcutでいい気が
eval容認するならもうcutでいい気が
729デフォルトの名無しさん
2018/09/05(水) 11:26:44.33ID:jCw2sC+8 なるほど
730デフォルトの名無しさん
2018/09/05(水) 11:33:48.80ID:jCw2sC+8 あら。" で括ってでいいみたい?また、入れ子にちゃんとなってるの?{ } でちゃんとなってるのか
echo "${a%"${a#?}"}"
dashでも大丈夫みたいな
echo "${a%"${a#?}"}"
dashでも大丈夫みたいな
731デフォルトの名無しさん
2018/09/05(水) 11:37:46.43ID:04P6tucf シングルクォートで駄目でもダブルクォートはいけるのか…
732デフォルトの名無しさん
2018/09/05(水) 12:19:13.88ID:NuDqxS96 あ、本当だ。パフォーマンス出るかな?
あとでやってみよう
あとでやってみよう
733デフォルトの名無しさん
2018/09/05(水) 12:30:25.22ID:NuDqxS96 >>728
WSLも使ってるんだよね。cygwinもそうだったけど
外部プロセス起動っていうかforkになるのかしらないけど、
かなり遅くて、これぐらいに差になっちゃう
time sh -c 'for i in $(seq 100); do echo > /dev/null; done'
real 0m0.030s
user 0m0.000s
sys 0m0.031s
time sh -c 'for i in $(seq 100); do /bin/echo > /dev/null; done'
real 0m1.213s
user 0m0.000s
sys 0m0.750s
WSLも使ってるんだよね。cygwinもそうだったけど
外部プロセス起動っていうかforkになるのかしらないけど、
かなり遅くて、これぐらいに差になっちゃう
time sh -c 'for i in $(seq 100); do echo > /dev/null; done'
real 0m0.030s
user 0m0.000s
sys 0m0.031s
time sh -c 'for i in $(seq 100); do /bin/echo > /dev/null; done'
real 0m1.213s
user 0m0.000s
sys 0m0.750s
734デフォルトの名無しさん
2018/09/05(水) 12:32:33.02ID:NuDqxS96 evalはさほど変わらない
time sh -c 'for i in $(seq 100); do eval "echo" > /dev/null; done'
real 0m0.031s
user 0m0.000s
sys 0m0.016s
time sh -c 'for i in $(seq 100); do eval "echo" > /dev/null; done'
real 0m0.031s
user 0m0.000s
sys 0m0.016s
735デフォルトの名無しさん
2018/09/05(水) 13:00:13.96ID:NuDqxS96736デフォルトの名無しさん
2018/09/06(木) 20:18:06.55ID:DUG5skog macOSのbrewでインストールしたdashで
echo '!' って実行したら \! ってなぜか
エスケープされて表示されるんだけど誰か心当たりある?
printf '%s' '!' でも \! と表示される
echo '!' って実行したら \! ってなぜか
エスケープされて表示されるんだけど誰か心当たりある?
printf '%s' '!' でも \! と表示される
737デフォルトの名無しさん
2018/09/06(木) 20:33:38.49ID:DUG5skog もう一つ
case '!' in
[\!]) echo OK ;;
*) echo NG ;;
esac
これを実行すると、kshだけNGって表示されるんだけどkshのバグ?
mkshだとOKなのに
case '!' in
[\!]) echo OK ;;
*) echo NG ;;
esac
これを実行すると、kshだけNGって表示されるんだけどkshのバグ?
mkshだとOKなのに
738デフォルトの名無しさん
2018/09/06(木) 22:05:19.31ID:DUG5skog >>736はここじゃ知ってる人少なそうなんでこっちに移動しますね。
OS XをUnixとして使ってる人の為のスレ 18 [無断転載禁止]©2ch.net
https://egg.5ch.net/test/read.cgi/mac/1462475819/
OS XをUnixとして使ってる人の為のスレ 18 [無断転載禁止]©2ch.net
https://egg.5ch.net/test/read.cgi/mac/1462475819/
739デフォルトの名無しさん
2018/09/07(金) 03:14:55.87ID:SvYUtRYX >>737
ブラケット内だけの特殊文字 ! (および ^) でのエスケープ対応が必須ならバグだし、言及してないとかだったら動作不定なだけだな
ブラケット内の ! と ^ でのエスケープが効く効かないの動作が違うのはcaseの場合だけじゃないよ
ブラケット内だけの特殊文字 ! (および ^) でのエスケープ対応が必須ならバグだし、言及してないとかだったら動作不定なだけだな
ブラケット内の ! と ^ でのエスケープが効く効かないの動作が違うのはcaseの場合だけじゃないよ
740デフォルトの名無しさん
2018/09/07(金) 08:32:30.20ID:dfq99u5c >>739
いろいろ挙動を調べたけど
1. ブラケット内で!のエスケープは必須ではないし、必要ない。
2. 多くの実装ではどんな文字でもエスケープできるため \! は ! と認識されるが、kshはそうではない
3. ブラケットの先頭に!をつけた、 [!・・・] は否定表現
4. 否定表現自体にはどの実装も対応している
5. 例えば[A]だとAにマッチだが、[!]だと否定表現として扱われる
6. kshでは[!]を否定表現として扱われるのを防ぐ方法がない
7. 普通は[]を使うときは2文字以上になるはずなので殆どの場合問題ない
(ただし何かの処理で動的にパターンを生成している場合はありえる)
ってことなのかな?
ちなみにこれ、POSIXブラケット表現っていう名前なのかな?
いろいろ挙動を調べたけど
1. ブラケット内で!のエスケープは必須ではないし、必要ない。
2. 多くの実装ではどんな文字でもエスケープできるため \! は ! と認識されるが、kshはそうではない
3. ブラケットの先頭に!をつけた、 [!・・・] は否定表現
4. 否定表現自体にはどの実装も対応している
5. 例えば[A]だとAにマッチだが、[!]だと否定表現として扱われる
6. kshでは[!]を否定表現として扱われるのを防ぐ方法がない
7. 普通は[]を使うときは2文字以上になるはずなので殆どの場合問題ない
(ただし何かの処理で動的にパターンを生成している場合はありえる)
ってことなのかな?
ちなみにこれ、POSIXブラケット表現っていう名前なのかな?
741デフォルトの名無しさん
2018/09/07(金) 08:42:27.12ID:SvYUtRYX 動的の場合もksh以外でもエスケープしなきゃならないんだから同じじゃね
[!] は文法上エラーのようなもんだから、そもそもブラケットで括らないとかなんかもう一文字入れて ! を2文字目にするとか
[!] は文法上エラーのようなもんだから、そもそもブラケットで括らないとかなんかもう一文字入れて ! を2文字目にするとか
742デフォルトの名無しさん
2018/09/07(金) 08:53:35.87ID:dfq99u5c あー、動的っていうのは、
> そもそもブラケットで括らないとかなんかもう一文字入れて ! を2文字目にするとか
ということをしたいんだけど、
ここが設定ファイルに書かれている文字とかで
ユーザーが1文字を指定してしまった場合
とかいうことです。
まあ1文字なら[!]じゃなくて!にするようにすればいいんですが。
> 動的の場合もksh以外でもエスケープしなきゃならないんだから同じじゃね
ksh以外だとエスケープして [\!] と書けばOKですが、
kshだとエスケープして [\!] と書いてもNGという問題です。
> そもそもブラケットで括らないとかなんかもう一文字入れて ! を2文字目にするとか
ということをしたいんだけど、
ここが設定ファイルに書かれている文字とかで
ユーザーが1文字を指定してしまった場合
とかいうことです。
まあ1文字なら[!]じゃなくて!にするようにすればいいんですが。
> 動的の場合もksh以外でもエスケープしなきゃならないんだから同じじゃね
ksh以外だとエスケープして [\!] と書けばOKですが、
kshだとエスケープして [\!] と書いてもNGという問題です。
743デフォルトの名無しさん
2018/09/07(金) 09:02:06.16ID:SvYUtRYX POSIXブラケット表現は違うんじゃないかなあ
ブラケットだけを何というのか知らんけど、パターンマッチング、ワイルドカード、グロブ定義のひとつかな。グロブがどうやららしいがそんな言葉使ったことないw
ブラケットだけを何というのか知らんけど、パターンマッチング、ワイルドカード、グロブ定義のひとつかな。グロブがどうやららしいがそんな言葉使ったことないw
744デフォルトの名無しさん
2018/09/07(金) 09:04:59.23ID:SvYUtRYX >>742
細かく拘ってるけど、なに言いたいのかちょっとわからないねえ。本題と関係ないってことでいいね?
細かく拘ってるけど、なに言いたいのかちょっとわからないねえ。本題と関係ないってことでいいね?
745デフォルトの名無しさん
2018/09/07(金) 09:18:53.90ID:dfq99u5c Bracket Expression
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_05
ワイルドカードっていうのは仕様ではなく何にでも使える文字という意味でしか無く
globはファイル名に展開するもののことだと思いますよ
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_05
ワイルドカードっていうのは仕様ではなく何にでも使える文字という意味でしか無く
globはファイル名に展開するもののことだと思いますよ
746デフォルトの名無しさん
2018/09/07(金) 09:27:59.54ID:SvYUtRYX じゃ、パターンマッチングでいいよ。めんどくさいw
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13
2.13.1 Patterns Matching a Single Character
では、エスケープ対応しろと読めるような気がしないでもない。が、! 関連ではエスケープだけじゃなく動作が違うな、dash/bash/kshでは(bashだけが違うというのもある)
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13
2.13.1 Patterns Matching a Single Character
では、エスケープ対応しろと読めるような気がしないでもない。が、! 関連ではエスケープだけじゃなく動作が違うな、dash/bash/kshでは(bashだけが違うというのもある)
747デフォルトの名無しさん
2018/09/07(金) 09:40:21.51ID:dfq99u5c あー、やっぱりバグな気がしてきました。
一旦変数に入れるとkshでもOKになりました
ちなみにksh以外とはbash、zsh、dash、yash、posh、mkshのことです。
# 挙動を合わせるためposix互換モードにしています
# もしかしてkshにも似たようなのありますかね?
# kshでPOSIXLY_CORRECT、set -o posixは使えませんでした。
[ -n "$BASH_VERSION" ] && set -o posix
[ -n "$ZSH_VERSION" ] && emulate -R sh
expression='[\!]'
case '!' in
$expression) echo OK ;; # ksh、ksh以外でOKになる
*) echo NG ;;
esac
case '!' in
[\!]) echo OK ;; # ksh以外でOKになる
*) echo NG ;; # kshだけNGとなる
esac
一旦変数に入れるとkshでもOKになりました
ちなみにksh以外とはbash、zsh、dash、yash、posh、mkshのことです。
# 挙動を合わせるためposix互換モードにしています
# もしかしてkshにも似たようなのありますかね?
# kshでPOSIXLY_CORRECT、set -o posixは使えませんでした。
[ -n "$BASH_VERSION" ] && set -o posix
[ -n "$ZSH_VERSION" ] && emulate -R sh
expression='[\!]'
case '!' in
$expression) echo OK ;; # ksh、ksh以外でOKになる
*) echo NG ;;
esac
case '!' in
[\!]) echo OK ;; # ksh以外でOKになる
*) echo NG ;; # kshだけNGとなる
esac
748デフォルトの名無しさん
2018/09/07(金) 09:44:26.93ID:SvYUtRYX なんか「バグ」にこだわっているようだけど、バグだったらバグレポートでもする気なの??
bashの [a!] の場合の方が大きな問題のような気がしないでもないが、それもエスケープすればすむのでkshさえなのかな??
bashの [a!] の場合の方が大きな問題のような気がしないでもないが、それもエスケープすればすむのでkshさえなのかな??
749デフォルトの名無しさん
2018/09/07(金) 09:52:52.93ID:dfq99u5c >>748
> bashの [a!] の場合の方が大きな問題のような気がしないでもないが、
どういうことでしょうか?
試してみましたが、どの環境でも想定通り動いているようですが。
↓検証コード
[ -n "${BASH_VERSION:-}" ] && set -o posix
[ -n "${ZSH_VERSION:-}" ] && emulate -R sh
expression='[a!]'
case '!' in
$expression) echo OK ;; # すべてでOKになる
*) echo NG ;;
esac
case '!' in
[a!]) echo OK ;; # すべてでOKになる
*) echo NG ;;
esac
!は最初に持ってきたときだけメタ文字扱い(エスケープが必要)で
途中にあってもエスケープは必要ないみたいですね。
(むしろエスケープしないほうが良いみたい。後述?)
> bashの [a!] の場合の方が大きな問題のような気がしないでもないが、
どういうことでしょうか?
試してみましたが、どの環境でも想定通り動いているようですが。
↓検証コード
[ -n "${BASH_VERSION:-}" ] && set -o posix
[ -n "${ZSH_VERSION:-}" ] && emulate -R sh
expression='[a!]'
case '!' in
$expression) echo OK ;; # すべてでOKになる
*) echo NG ;;
esac
case '!' in
[a!]) echo OK ;; # すべてでOKになる
*) echo NG ;;
esac
!は最初に持ってきたときだけメタ文字扱い(エスケープが必要)で
途中にあってもエスケープは必要ないみたいですね。
(むしろエスケープしないほうが良いみたい。後述?)
750デフォルトの名無しさん
2018/09/07(金) 09:57:25.65ID:SvYUtRYX ああ、すまん勘違いしてた。コマンドライン上での ! でのヒストリからの展開だった
751デフォルトの名無しさん
2018/09/07(金) 10:04:32.56ID:dfq99u5c !が最初以外にある場合に、\! とエスケープするとどうなるか?ですが挙動がバラけました。
[ -n "${BASH_VERSION:-}" ] && set -o posix
[ -n "${ZSH_VERSION:-}" ] && emulate -R sh
expression='[a\!]'
case '\' in
$expression) echo OK ;;
*) echo NG ;;
esac
case '\' in
[a\!]) echo OK ;;
*) echo NG ;;
esac
# 変数に入れると a \ ! のいずれかだと判断されている
#(\はエスケープ文字列として認識されていない)
ksh OK NG
zsh OK NG
yash OK NG
posh OK NG
mksh OK NG
# 変数に入れると a ! のいずれかだと判断されている
#(\はエスケープ文字列として認識されている)
bash NG NG
dash NG NG
変数に入れない場合は、どちらも\はエスケープ文字列として認識されている
[ -n "${BASH_VERSION:-}" ] && set -o posix
[ -n "${ZSH_VERSION:-}" ] && emulate -R sh
expression='[a\!]'
case '\' in
$expression) echo OK ;;
*) echo NG ;;
esac
case '\' in
[a\!]) echo OK ;;
*) echo NG ;;
esac
# 変数に入れると a \ ! のいずれかだと判断されている
#(\はエスケープ文字列として認識されていない)
ksh OK NG
zsh OK NG
yash OK NG
posh OK NG
mksh OK NG
# 変数に入れると a ! のいずれかだと判断されている
#(\はエスケープ文字列として認識されている)
bash NG NG
dash NG NG
変数に入れない場合は、どちらも\はエスケープ文字列として認識されている
752デフォルトの名無しさん
2018/09/07(金) 10:11:14.19ID:dfq99u5c まとめると、どのシェルでも同じように動かすには
1. 可能ならば!は[]の最初に書かない
2. 1を満たしている場合には、!はエスケープする必要はない(しても良い)
3. !が[]の最初に書く場合は変数に入れてマッチングさせる
4. 3の場合には、!はエスケープする
というところでしょうか?
1. 可能ならば!は[]の最初に書かない
2. 1を満たしている場合には、!はエスケープする必要はない(しても良い)
3. !が[]の最初に書く場合は変数に入れてマッチングさせる
4. 3の場合には、!はエスケープする
というところでしょうか?
753デフォルトの名無しさん
2018/09/07(金) 10:11:47.58ID:SvYUtRYX んー、発表会なの??どうすんのかどう書くのかじゃないのか??
754デフォルトの名無しさん
2018/09/07(金) 10:13:19.48ID:SvYUtRYX ! を文字としてなら、ブラッケットで括らない、他の文字があるなら2文字目以降にする
だけじゃないのかなあ
だけじゃないのかなあ
755デフォルトの名無しさん
2018/09/07(金) 17:31:04.46ID:+cI6iexZ >>736はへえと思ったけど他は正直どうでもいい
シェルによって違いはあるものだし同じシェルでもバージョンによっても違うかもしれないし
シェルによって違いはあるものだし同じシェルでもバージョンによっても違うかもしれないし
756デフォルトの名無しさん
2018/09/08(土) 12:02:12.04ID:t/+GvP7Y 文字列の末尾がLFのものを別の変数に入れる場合、
b=$a ってするしかないかな?
b=$(foo "$a") ってやったら消えるよね
関数で処理した結果を変数に代入したいんだけど、文字列末尾のLFは消したくないし、
LFはない場合も複数個の場合もあるので無条件にLFつけたりもできない
b=$a ってするしかないかな?
b=$(foo "$a") ってやったら消えるよね
関数で処理した結果を変数に代入したいんだけど、文字列末尾のLFは消したくないし、
LFはない場合も複数個の場合もあるので無条件にLFつけたりもできない
757デフォルトの名無しさん
2018/09/08(土) 12:14:51.45ID:S5S855ao IFS
758デフォルトの名無しさん
2018/09/08(土) 12:29:20.28ID:S5S855ao IFS変更しなくてもb=$(foo "$a")ってやったら消えてないじゃん。"$a"ならば
759デフォルトの名無しさん
2018/09/08(土) 12:57:29.41ID:t/+GvP7Y 消えますよ
[test.sh]
IFS=""
LF=$(printf '\012_') LF=${LF%_}
a="test$LF$LF$LF"
foo() { printf '%s' "$1"; }
printf '%s' "$a" # 1つめのテストの末尾のLFは消えていない
b="$(foo "$a")"
printf '%s' "$b" # 2つめのテストの末尾のLFは消えてる
[実行]
test.sh | hexdump -C
00000000 74 65 73 74 0a 0a 0a 74 65 73 74 |test...test|
[test.sh]
IFS=""
LF=$(printf '\012_') LF=${LF%_}
a="test$LF$LF$LF"
foo() { printf '%s' "$1"; }
printf '%s' "$a" # 1つめのテストの末尾のLFは消えていない
b="$(foo "$a")"
printf '%s' "$b" # 2つめのテストの末尾のLFは消えてる
[実行]
test.sh | hexdump -C
00000000 74 65 73 74 0a 0a 0a 74 65 73 74 |test...test|
760デフォルトの名無しさん
2018/09/08(土) 13:25:21.83ID:wZDaW80s foo() { printf '%s ' "$1"; } とすると挙動が変わるんだね
761デフォルトの名無しさん
2018/09/08(土) 13:28:37.24ID:t/+GvP7Y 違う。$(・・・)をすると挙動が変わる(末尾のLFに全削除の効果)
foo "$a" だけなら末尾のLFは消えない
foo "$a" だけなら末尾のLFは消えない
762デフォルトの名無しさん
2018/09/08(土) 13:38:57.95ID:wZDaW80s Command substitution の仕様ってことね。
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03
> removing sequences of one or more <newline> characters at the end of the substitution.
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03
> removing sequences of one or more <newline> characters at the end of the substitution.
763デフォルトの名無しさん
2018/09/08(土) 13:54:13.20ID:t/+GvP7Y そういやファイル名やディレクトリ名に改行を含めるべきかどうか
POSIXで議論してるみたいな話が上の方で書いてあったけど
名前の末尾に改行が含まれてる場合に消えるから
dirnameやbasenameで取得できないってことになるな。
もういい加減仕様で含めるのやめればいいのに
POSIXで議論してるみたいな話が上の方で書いてあったけど
名前の末尾に改行が含まれてる場合に消えるから
dirnameやbasenameで取得できないってことになるな。
もういい加減仕様で含めるのやめればいいのに
764デフォルトの名無しさん
2018/09/08(土) 16:24:05.28ID:xje6Dohs 実際名前に改行含めるような仕事したくないけどな
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【サッカー】運命のW杯抽選会、NHK総合が生中継&DAZNが無料ライブ配信! 今夜 12月5日(金)26時~ ★4 [阿弥陀ヶ峰★]
- 【サッカー】2026年北中米W杯の組み合わせが決定! 日本代表はオランダ、チュニジア、欧州プレーオフB勝者と同組で激突 [久太郎★]
- ひろゆき氏、日中対立に 「結局、人口というのは国力なので。10億人以上いる国に、1億2000万人で対抗可能であるというのが間違い」 [冬月記者★]
- 渡邊渚「性を売ってるくせに」批判に反論 幻滅「これが日本の現状だよなー」「『渾身の下着!』というような意味でやってない」★2 [Ailuropoda melanoleuca★]
- 【千葉】会社で58歳女性刺される 殺人未遂容疑で同僚の中国籍の男(39)逮捕 女性死亡 いすみ市 [ぐれ★]
- 【生成ポルノで初】AI生成の児童ポルノ画像の所持疑いで元教諭を初摘発… [BFU★]
- 【NHK他】FIFAワールドカップ2026 はじまらない組み合わせ抽選★3
- 【NHK他】FIFAワールドカップ2026 はじまらない組み合わせ抽選★4
- とらせんIP ★2
- こいせん 全レス転載禁止
- 西武線 2
- 巨専】
- 【NHK/DAZN/YouTube】FIFAワールドカップ2026組み合わせ抽選★3
- 【01:45NHK~】サッカーW杯2026グルーブ分け組み合わせ抽選会いよいよスタート! ★2 [339712612]
- 【実況】サッカーワールドカップ組み合わせ抽選会
- 【風向き】ヤバい!高市が導入を検討する「防衛特別所得税」、ネトウヨらもまさかの反対の大合唱。。さすがに国民を舐めすぎたか? [219241683]
- 平和なお🏡🕊
- 【速報】人気ミュージシャン、高市首相のアーティスト支援表明にブチギレ「自分で潰しておいてどの口が…一刻は早く辞任しろ!」 [339712612]
