シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
前スレ:
シェルスクリプト総合 その28
http://mevius.5ch.net/test/read.cgi/tech/1532397676/
探検
シェルスクリプト総合 その29
■ このスレッドは過去ログ倉庫に格納されています
2018/09/21(金) 23:34:47.98ID:/eJt2TVD
616デフォルトの名無しさん
2019/06/03(月) 04:53:12.91ID:xnZUjfNJ >>613
仕様です。
・1h23m45s みたいな秒には対応していません。エラーになります。
・mは必須です。mを省略した場合エラーになります。1.5hの場合は1.5h00mと入力してください。
・1文字のmには対応していません。エラーになります。1mは01mと入力してください。
・mが3文字以上で文字数が奇数の場合は、対応していません。エラーになります。
・mが4文字以上で文字数が偶数の場合は、下位2文字のみが使用されます。(例 1234m の場合 34、12.345の場合45)
・1文字のhには対応しています。
・hの文字数が偶数の場合は、下位2文字のみが使用されます。(例 1234h の場合 34、1.23の場合23)
・hの文字数奇数の場合は、最初の1文字と下位2文字をあわせた、3文字が使用されます。(例 12345h の場合 145、123.5の場合1.5、1.23の場合23)
仕様です。
・1h23m45s みたいな秒には対応していません。エラーになります。
・mは必須です。mを省略した場合エラーになります。1.5hの場合は1.5h00mと入力してください。
・1文字のmには対応していません。エラーになります。1mは01mと入力してください。
・mが3文字以上で文字数が奇数の場合は、対応していません。エラーになります。
・mが4文字以上で文字数が偶数の場合は、下位2文字のみが使用されます。(例 1234m の場合 34、12.345の場合45)
・1文字のhには対応しています。
・hの文字数が偶数の場合は、下位2文字のみが使用されます。(例 1234h の場合 34、1.23の場合23)
・hの文字数奇数の場合は、最初の1文字と下位2文字をあわせた、3文字が使用されます。(例 12345h の場合 145、123.5の場合1.5、1.23の場合23)
617デフォルトの名無しさん
2019/06/03(月) 04:54:33.38ID:xnZUjfNJ618デフォルトの名無しさん
2019/06/03(月) 05:00:32.74ID:xnZUjfNJ 仕様漏れ
・hは必須です。hを省略した場合エラーになります。30mの場合は0h30mと入力してください。
・hは必須です。hを省略した場合エラーになります。30mの場合は0h30mと入力してください。
619デフォルトの名無しさん
2019/06/03(月) 05:42:18.06ID:MigZwPEH なんやこいつ。またか
620デフォルトの名無しさん
2019/06/03(月) 06:51:59.05ID:xnZUjfNJ >>619
なににムカついたの?
なににムカついたの?
621デフォルトの名無しさん
2019/06/03(月) 07:25:22.55ID:amnwC05e >>616
> ・mが4文字以上で文字数が偶数の場合は、下位2文字のみが使用されます。(例 1234m の場合 34、12.345の場合45)
この仕様の意味ってなに?
この仕様を無視して,
「mの前の数字は2桁でなくてはならない」
という仕様に統一すれば,すごく書き易いシェルスクリプトになると思うんだけど。
> ・mが4文字以上で文字数が偶数の場合は、下位2文字のみが使用されます。(例 1234m の場合 34、12.345の場合45)
この仕様の意味ってなに?
この仕様を無視して,
「mの前の数字は2桁でなくてはならない」
という仕様に統一すれば,すごく書き易いシェルスクリプトになると思うんだけど。
622デフォルトの名無しさん
2019/06/03(月) 07:29:35.13ID:amnwC05e >>616
追加で質問。
なんでhやmの前の数字の桁数の偶奇に拘るの?
例えば,
・mの前には二桁の整数(0埋め)しか許されない
・hの前には小数点以下一位の精度で99以下の数しか許されない
という仕様のほうが,仕様も短かいし実装も簡潔になると思うんだけど。
追加で質問。
なんでhやmの前の数字の桁数の偶奇に拘るの?
例えば,
・mの前には二桁の整数(0埋め)しか許されない
・hの前には小数点以下一位の精度で99以下の数しか許されない
という仕様のほうが,仕様も短かいし実装も簡潔になると思うんだけど。
623デフォルトの名無しさん
2019/06/03(月) 08:15:05.64ID:8eXXlkO0 Ruby では、
re = /([^h]+)h([^m]+)m/
# str = "1h0m"
str = "1.5h0m"
md = str.match( re )
# p md[ 1 ], md[ 2 ] #=> capture 部分
begin # 整数じゃなければ、浮動小数点にする
hour = Integer( md[ 1 ] )
rescue ArgumentError
hour = Float( md[ 1 ] )
end
minute = md[ 2 ].to_i # 整数
p hour, minute #=> 1.5, 0
re = /([^h]+)h([^m]+)m/
# str = "1h0m"
str = "1.5h0m"
md = str.match( re )
# p md[ 1 ], md[ 2 ] #=> capture 部分
begin # 整数じゃなければ、浮動小数点にする
hour = Integer( md[ 1 ] )
rescue ArgumentError
hour = Float( md[ 1 ] )
end
minute = md[ 2 ].to_i # 整数
p hour, minute #=> 1.5, 0
624デフォルトの名無しさん
2019/06/03(月) 09:09:22.60ID:8ZNdPBG6625デフォルトの名無しさん
2019/06/03(月) 09:23:57.43ID:amnwC05e >>624
ほーん。*長文*ありがとう。
ほーん。*長文*ありがとう。
626デフォルトの名無しさん
2019/06/03(月) 09:33:21.71ID:0fpHz+xZ >>614
\([0-9.][0-9.]\)*m が入ってしまっているので、
echo "($(echo '1.5h00m' | sed -e 's/\([0-9.][0-9.]\)*h\([0-9.][0-9.]\)*m/\1 * 60 + \2/')) * 60"
とかするしかない
echo "($(echo '1.5h' | sed -e 's/\([0-9.][0-9.]\)*h\(\([0-9.][0-9.]\)*m\)\?/\1 * 60 + \3/')) * 60"
なんてすると、 (1.5 * 60 + ) * 60 になって bc で syntax error
\([0-9.][0-9.]\)*m が入ってしまっているので、
echo "($(echo '1.5h00m' | sed -e 's/\([0-9.][0-9.]\)*h\([0-9.][0-9.]\)*m/\1 * 60 + \2/')) * 60"
とかするしかない
echo "($(echo '1.5h' | sed -e 's/\([0-9.][0-9.]\)*h\(\([0-9.][0-9.]\)*m\)\?/\1 * 60 + \3/')) * 60"
なんてすると、 (1.5 * 60 + ) * 60 になって bc で syntax error
627デフォルトの名無しさん
2019/06/03(月) 09:35:00.19ID:z2LdD30j >>626
行き当たりばったりのクソコードなんか相手にしなくていいで
行き当たりばったりのクソコードなんか相手にしなくていいで
628デフォルトの名無しさん
2019/06/03(月) 09:40:07.68ID:z2LdD30j 代わりに俺が同じアプローチのまとなコード書いてやるからよ
echo '1.5h' | sed -E 's/(([0-9.]+)h)?(([0-9.]+)m)?(([0-9.]+)s)?/(\2-0)*3600+(\4-0)*60+(\6-0)/' | bc
(.0を消したければ>>615を参考に /1 すればいい)
echo '1.5h' | sed -E 's/(([0-9.]+)h)?(([0-9.]+)m)?(([0-9.]+)s)?/(\2-0)*3600+(\4-0)*60+(\6-0)/' | bc
(.0を消したければ>>615を参考に /1 すればいい)
629デフォルトの名無しさん
2019/06/03(月) 09:49:10.30ID:0fpHz+xZ やるなぁ、、て言うか相手してやってるやんw
630デフォルトの名無しさん
2019/06/03(月) 09:52:56.88ID:z2LdD30j クソコードはクソコードで終わりでいいって話
あ、クソコードですね♪使い物になりませんね♪でいいってことよ。
いちいちこういう場合にエラーがなりますとかやらなくていい
さっさと廃棄処分してしまおう。
あ、クソコードですね♪使い物になりませんね♪でいいってことよ。
いちいちこういう場合にエラーがなりますとかやらなくていい
さっさと廃棄処分してしまおう。
631623
2019/06/03(月) 11:22:16.99ID:8eXXlkO0 まず設計がおかしい!
バグのほとんどは、設計がおかしいから起きる
時間は、0〜24 の整数のみ。
分は、0〜60 の整数のみ
最大で、24時間までとか
整数に変換できなければ、浮動小数点に変換するとか、こんなおかしな設計はない!
バグのほとんどは、設計がおかしいから起きる
時間は、0〜24 の整数のみ。
分は、0〜60 の整数のみ
最大で、24時間までとか
整数に変換できなければ、浮動小数点に変換するとか、こんなおかしな設計はない!
632デフォルトの名無しさん
2019/06/03(月) 11:25:36.69ID:8qtiF3dA633デフォルトの名無しさん
2019/06/03(月) 11:26:56.98ID:amnwC05e >>632
やめたれw
やめたれw
634デフォルトの名無しさん
2019/06/03(月) 12:27:27.29ID:3fU/jk6b つまりrubyを使うと統合失調症になってしまうということ?
635デフォルトの名無しさん
2019/06/03(月) 13:18:07.10ID:amnwC05e そんなことには、ならない!
Rubyは、すばらしい言語
Rubyは、すばらしい言語
636デフォルトの名無しさん
2019/06/03(月) 13:28:47.52ID:3fU/jk6b やっぱりなってしまうんだね…
637623
2019/06/04(火) 05:26:37.80ID://1XsOfQ 整数に変換できなければ、浮動小数点に変換するとか、明らかにおかしいでしょ?
だから、質問者に言われた通りに書いたら、おかしいと言うこと!
>>631
>時間は、0〜24 の整数のみ。
>分は、0〜60 の整数のみ
多くの言語が採用しているのは、
時間は、0〜23 の整数のみ。
分は、0〜59 の整数のみ
色んな言語の、Time クラスのメソッドを参照
だから、質問者に言われた通りに書いたら、おかしいと言うこと!
>>631
>時間は、0〜24 の整数のみ。
>分は、0〜60 の整数のみ
多くの言語が採用しているのは、
時間は、0〜23 の整数のみ。
分は、0〜59 の整数のみ
色んな言語の、Time クラスのメソッドを参照
638デフォルトの名無しさん
2019/06/04(火) 05:55:02.35ID:oQKNEIyc >>623「整数に変換できなければ、浮動小数点に変換する」
↓
>>631「整数に変換できなければ、浮動小数点に変換するとか、こんなおかしな設計はない!」
↓
>>637「質問者が整数に変換できなければ、浮動小数点に変換するって言った!浮動小数点でスレを検索してみろ!」
【検索結果】
623 名前:デフォルトの名無しさん[sage] 投稿日:2019/06/03(月) 08:15:05.64 ID:8eXXlkO0 [1/2]
631 名前:623[sage] 投稿日:2019/06/03(月) 11:22:16.99 ID:8eXXlkO0 [2/2]
637 名前:623[] 投稿日:2019/06/04(火) 05:26:37.80 ID://1XsOfQ
↓
>>631「整数に変換できなければ、浮動小数点に変換するとか、こんなおかしな設計はない!」
↓
>>637「質問者が整数に変換できなければ、浮動小数点に変換するって言った!浮動小数点でスレを検索してみろ!」
【検索結果】
623 名前:デフォルトの名無しさん[sage] 投稿日:2019/06/03(月) 08:15:05.64 ID:8eXXlkO0 [1/2]
631 名前:623[sage] 投稿日:2019/06/03(月) 11:22:16.99 ID:8eXXlkO0 [2/2]
637 名前:623[] 投稿日:2019/06/04(火) 05:26:37.80 ID://1XsOfQ
639デフォルトの名無しさん
2019/06/04(火) 06:05:44.33ID:oQKNEIyc >>637
俺はシェルスクリプトもRubyも上級者なんだよなぁ(苦笑)
$ irb
irb(main):001:0> require 'active_support/time'
=> true
irb(main):002:0> 1.5.hours
=> 5400.0 seconds
俺はシェルスクリプトもRubyも上級者なんだよなぁ(苦笑)
$ irb
irb(main):001:0> require 'active_support/time'
=> true
irb(main):002:0> 1.5.hours
=> 5400.0 seconds
640デフォルトの名無しさん
2019/06/04(火) 11:07:03.94ID:P6ocUs46 >>638
草ァ!
草ァ!
641デフォルトの名無しさん
2019/06/04(火) 23:40:36.15ID:91A1BNDa >>591
最初に引数を"h"→"h "、"m"→"m "に変換するといいんじゃないかな
最初に引数を"h"→"h "、"m"→"m "に変換するといいんじゃないかな
642デフォルトの名無しさん
2019/06/05(水) 00:03:31.85ID:uJguGtrO 小数点を含んだ時刻表記(単位は時・分)を秒数に正規化する,みたいな話かね
643デフォルトの名無しさん
2019/06/05(水) 01:44:13.04ID:Rs8bMd2A 練習のために書いてて、うまい書き方は無いかという話だった気がするのだが…
644デフォルトの名無しさん
2019/06/05(水) 12:04:44.96ID:UTQhx3T7 だよな、単に。sedならという応えも直後にあっての
変なのが変な話に変えてる
変なのが変な話に変えてる
645デフォルトの名無しさん
2019/06/05(水) 12:17:13.51ID:HgsnwJuZ 質問者「今から1時間後とか、あと1.5時間後とかにも対応してみました」
Ruby厨「整数に変換できなければ、浮動小数点に変換するとか、こんなおかしな設計はない!」
Ruby厨「時間は0〜24の整数のみ! 午前1時30分のことを1.5時とか言わない!」
Ruby厨「整数に変換できなければ、浮動小数点に変換するとか、こんなおかしな設計はない!」
Ruby厨「時間は0〜24の整数のみ! 午前1時30分のことを1.5時とか言わない!」
646デフォルトの名無しさん
2019/06/05(水) 15:13:01.25ID:ufQ3ijM/ バッシュでファイル名がアスキーコードが判定する方法教えて下さい一番簡単に
アスキーコードはUTF8の一部でもあるのでnkfは確認出来ないとおもいました
アスキーコードはUTF8の一部でもあるのでnkfは確認出来ないとおもいました
647デフォルトの名無しさん
2019/06/05(水) 16:22:42.00ID:ujLKUPuk if iconv -t ASCII <<< "$filename" > /dev/null 2>&1; then
必要なら -f を。必要なら ASCII 以外の他のエンコーディングを
必要なら -f を。必要なら ASCII 以外の他のエンコーディングを
648デフォルトの名無しさん
2019/06/05(水) 16:47:06.73ID:HgsnwJuZ >>646
この程度でbash専用にする必要ない。nkfもiconvも遅い。
case $filename in
*[!a-z]*) # a-z以外の文字がある
*) # a-zのみ
esac
あとはASCIIのみになるようにすればいい
POSIX文字クラスを使うと楽
https://en.wikibooks.org/wiki/Regular_Expressions/POSIX_Basic_Regular_Expressions#Character_classes
制御コード入れたいのかにもよるのとASCIIコード以外にあてはまるかどうか調べてないが
例えば [![:cntrl:][:print:]] とかかな? 最悪一文字ずつ書けばいいだろう。
この程度でbash専用にする必要ない。nkfもiconvも遅い。
case $filename in
*[!a-z]*) # a-z以外の文字がある
*) # a-zのみ
esac
あとはASCIIのみになるようにすればいい
POSIX文字クラスを使うと楽
https://en.wikibooks.org/wiki/Regular_Expressions/POSIX_Basic_Regular_Expressions#Character_classes
制御コード入れたいのかにもよるのとASCIIコード以外にあてはまるかどうか調べてないが
例えば [![:cntrl:][:print:]] とかかな? 最悪一文字ずつ書けばいいだろう。
649デフォルトの名無しさん
2019/06/05(水) 17:15:11.07ID:xkVLsoK0650デフォルトの名無しさん
2019/06/05(水) 17:16:08.94ID:HgsnwJuZ >>649
何もおかしなところ無いんだが?
何もおかしなところ無いんだが?
651デフォルトの名無しさん
2019/06/05(水) 17:18:19.69ID:xkVLsoK0 正しく動くASCII判定のをどうぞ
652デフォルトの名無しさん
2019/06/05(水) 17:21:46.42ID:HgsnwJuZ あぁ、なにか言い返したかっただけかw
653デフォルトの名無しさん
2019/06/05(水) 17:27:42.29ID:xkVLsoK0 やはりRuby厨と変わらないw
正しく動くのを示せばいいだけでしょ、勝手にa-zだけじゃなく。それがちゃんとASCIIと判定できるなら
正しく動くのを示せばいいだけでしょ、勝手にa-zだけじゃなく。それがちゃんとASCIIと判定できるなら
654デフォルトの名無しさん
2019/06/05(水) 17:30:08.86ID:HgsnwJuZ 質問者じゃないお前と問答する意味ないよ
655デフォルトの名無しさん
2019/06/05(水) 17:31:24.15ID:xkVLsoK0 横槍はするが、自分に横槍すんなか。やはりRuby厨と変わらないw
656デフォルトの名無しさん
2019/06/05(水) 17:34:27.22ID:HgsnwJuZ よっぽど悔しかったんだろうなぁ(笑)
657デフォルトの名無しさん
2019/06/05(水) 17:37:01.79ID:xkVLsoK0658デフォルトの名無しさん
2019/06/05(水) 17:39:55.68ID:HgsnwJuZ だからお前と問答する必要はない話だよねw
質問者にヒントを出した。あとは自分でやるか、"質問者"が泣きつくかどうかだろ
なんでお前が泣きついてるんだ?えーんえーん(笑)
質問者にヒントを出した。あとは自分でやるか、"質問者"が泣きつくかどうかだろ
なんでお前が泣きついてるんだ?えーんえーん(笑)
659デフォルトの名無しさん
2019/06/05(水) 17:43:17.72ID:xkVLsoK0 ヒントを出した、泣きつくかどうか
よくそんな言葉吐けるな。ちょっと前のいつものヤツか、その子供のような最後といい、よく恥ずかしげもなく書けるなw
よくそんな言葉吐けるな。ちょっと前のいつものヤツか、その子供のような最後といい、よく恥ずかしげもなく書けるなw
660デフォルトの名無しさん
2019/06/05(水) 17:47:03.77ID:HgsnwJuZ やっぱりいつもの悔しい思いをしたやつだったかw
661デフォルトの名無しさん
2019/06/05(水) 17:51:21.47ID:oTS9vdrC いつものヤツだったのは正解らしいww
662デフォルトの名無しさん
2019/06/05(水) 17:56:56.88ID:HgsnwJuZ いつもの悔しい思いをしたやつってのは正解らしいwww
663デフォルトの名無しさん
2019/06/05(水) 17:58:17.08ID:oTS9vdrC は?お前は敵がいっぱいだなwww
664デフォルトの名無しさん
2019/06/05(水) 17:59:16.05ID:xpgfEjrk お前ほどじゃないよw
665デフォルトの名無しさん
2019/06/05(水) 18:01:04.69ID:ye33y5kG bash や zsh の場合、locale 依存なんだなぁ
$ bash -c 'LC_CTYPE=C; case 1 in *[![:cntrl:][:print:]]*) echo 'x';; *) echo 'y';; esac'
x
$ bash -c 'LC_CTYPE=ja_JP.UTF-8; case 1 in *[![:cntrl:][:print:]]*) echo 'x';; *) echo 'y';; esac'
y
bash で [:ascii:] を使う場合には locale は関係なし
$ bash -c 'LC_CTYPE=C; [[ 1 = *[![:ascii:]]* ]] && echo x || echo y'
x
$ bash -c 'LC_CTYPE=ja_JP.UTF-8; [[ 1 = *[![:ascii:]]* ]] && echo x || echo y'
x
$ bash -c 'LC_CTYPE=C; case 1 in *[![:cntrl:][:print:]]*) echo 'x';; *) echo 'y';; esac'
x
$ bash -c 'LC_CTYPE=ja_JP.UTF-8; case 1 in *[![:cntrl:][:print:]]*) echo 'x';; *) echo 'y';; esac'
y
bash で [:ascii:] を使う場合には locale は関係なし
$ bash -c 'LC_CTYPE=C; [[ 1 = *[![:ascii:]]* ]] && echo x || echo y'
x
$ bash -c 'LC_CTYPE=ja_JP.UTF-8; [[ 1 = *[![:ascii:]]* ]] && echo x || echo y'
x
666デフォルトの名無しさん
2019/06/05(水) 18:05:10.12ID:xpgfEjrk >>665
そうそう。だから面倒なので「ASCIIコード以外にあてはまるかどうか調べてない」し
「最悪一文字ずつ書けばいい」
あとbashやzshって限定しなくて良いよ。全部そうだから
> bash で [:ascii:] を使う場合には
[:ascii:]はPOSIXクラスじゃない
そうそう。だから面倒なので「ASCIIコード以外にあてはまるかどうか調べてない」し
「最悪一文字ずつ書けばいい」
あとbashやzshって限定しなくて良いよ。全部そうだから
> bash で [:ascii:] を使う場合には
[:ascii:]はPOSIXクラスじゃない
667デフォルトの名無しさん
2019/06/05(水) 18:12:43.44ID:9iVEjLSM なんで誰も求めていないPOSIXや速さにそんなにこだわるんだかな
>>665はちゃんと前段と分けて「bash で [:ascii:] を使う場合」とも言っている=「bashで」と言っているのに、なんでそうも自分は知ってるを出したいんだか
>>665はちゃんと前段と分けて「bash で [:ascii:] を使う場合」とも言っている=「bashで」と言っているのに、なんでそうも自分は知ってるを出したいんだか
668デフォルトの名無しさん
2019/06/05(水) 18:15:02.41ID:ye33y5kG ところが Ubuntu の dash(conform with the POSIX 1003.2 and
1003.2a specifications for the shell)は依存しないのよね…(上の例ではどちらも x を返す)
1003.2a specifications for the shell)は依存しないのよね…(上の例ではどちらも x を返す)
669デフォルトの名無しさん
2019/06/05(水) 18:15:24.53ID:oTS9vdrC 他人のレスを読めないのに妄想だけは
いつものことか
いつものことか
670デフォルトの名無しさん
2019/06/05(水) 18:15:31.51ID:xpgfEjrk 「求めていない」と明言していない以上、
「求めていない」なんてお前が断定するなってことだよ。
「求めていない」なんてお前が断定するなってことだよ。
671デフォルトの名無しさん
2019/06/05(水) 18:17:47.05ID:9iVEjLSM 読めない人だねえ
672デフォルトの名無しさん
2019/06/05(水) 18:21:58.87ID:9iVEjLSM673デフォルトの名無しさん
2019/06/05(水) 18:29:57.26ID:9iVEjLSM dashはプログラムでロケール(LC_CTYPE)の設定をしてない手抜きとかか。も考えられるね。どうであろうとデフォ= Cという
674デフォルトの名無しさん
2019/06/06(木) 17:44:19.74ID:KuydtzNG675デフォルトの名無しさん
2019/06/06(木) 19:05:13.64ID:f9T2ABl2 虚栄心の塊を助けるような真似はしたくはないな俺だったら
676デフォルトの名無しさん
2019/06/07(金) 08:04:35.63ID:rFfmCjQx 「助ける」って表現おかしくね?
だって誰も「助けてくれ」なんて言ってないじゃん。
既に質問者の「助けて」には親切な奴が答えてくれている途中だった。
正しく動くプログラムに勝手にケチ付けた挙句、なんの案も出さずに「間違ってる」だけしか言ってないよね。
だって誰も「助けてくれ」なんて言ってないじゃん。
既に質問者の「助けて」には親切な奴が答えてくれている途中だった。
正しく動くプログラムに勝手にケチ付けた挙句、なんの案も出さずに「間違ってる」だけしか言ってないよね。
677デフォルトの名無しさん
2019/06/07(金) 09:02:53.19ID:wbS/xMGA それな。
こっちは「こんな感じで作れますよー」って言ってるだけ
あとは簡単なので質問者でもできるだろう
(できないなら何かしらのレスをするだろう)
そこにいちいち、それは完璧に動かないって言うだけ。言うだけ厨w
こっちは「こんな感じで作れますよー」って言ってるだけ
あとは簡単なので質問者でもできるだろう
(できないなら何かしらのレスをするだろう)
そこにいちいち、それは完璧に動かないって言うだけ。言うだけ厨w
678デフォルトの名無しさん
2019/06/07(金) 14:05:05.10ID:tJklw1kZ 怪しいレスだなw
679デフォルトの名無しさん
2019/06/07(金) 23:38:40.76ID:sMkNqk8q680デフォルトの名無しさん
2019/06/12(水) 05:02:41.26ID:mlkAn7XZ シェルスクリプトのスレは以下に統合しました。
今後シェルスクリプトの話題はこちらで
くだらねえ質問はここに書き込め! Part 236
https://mao.5ch.net/test/read.cgi/linux/1556462911/
今後シェルスクリプトの話題はこちらで
くだらねえ質問はここに書き込め! Part 236
https://mao.5ch.net/test/read.cgi/linux/1556462911/
681デフォルトの名無しさん
2019/06/14(金) 01:38:30.44ID:ndORQo1H 某知恵袋で見かけた「ID非公開」さんの質問。
> Linuxのシェルスクリプトで質問です。
> リダイレクトの0は標準入力、1は標準出力、2は標準エラー出力。
> 0、1、2の他にも、3以上の番号もあるそうです。
> これら、3以上の番号を使った例を教えてください。
カテゴリマスター sle********さんの回答
> ファイルをオープンすれば3から順に使われるのだけど。
> 0,1,2の3つしか呼び出すプログラムには伝わらないのでできないのじゃないかな。
シェルスクリプトの話だということすら理解できてないなら回答するなよ。
シェルスクリプト リダイレクト exec
でググれよとか思ったけど、「ID非公開」という時点で相手にする価値が無いしなあ…
> Linuxのシェルスクリプトで質問です。
> リダイレクトの0は標準入力、1は標準出力、2は標準エラー出力。
> 0、1、2の他にも、3以上の番号もあるそうです。
> これら、3以上の番号を使った例を教えてください。
カテゴリマスター sle********さんの回答
> ファイルをオープンすれば3から順に使われるのだけど。
> 0,1,2の3つしか呼び出すプログラムには伝わらないのでできないのじゃないかな。
シェルスクリプトの話だということすら理解できてないなら回答するなよ。
シェルスクリプト リダイレクト exec
でググれよとか思ったけど、「ID非公開」という時点で相手にする価値が無いしなあ…
682デフォルトの名無しさん
2019/06/14(金) 02:49:59.61ID:IaHhNJVN なにをいいたいのだか
683デフォルトの名無しさん
2019/06/14(金) 14:10:08.67ID:BMAIfRwQ まあ確かにその説明は間違ってるけど
態々Yahoo知恵袋の回答を5chに持って来てまで叩くことあるかね……。
態々Yahoo知恵袋の回答を5chに持って来てまで叩くことあるかね……。
684デフォルトの名無しさん
2019/06/14(金) 22:48:51.07ID:0KPEzZXE そう言えば以前 flock コマンドを使ってここに書かれているような排他ロックを掛けるのを書いたことがある。
http://fj.hatenablog.jp/entry/2016/03/12/223319
で、リダイレクトはこの例のように 200 とか使ったのだが、しかし、これが使われていたらまともに動かないのではないかと思う。
かといって現在使われていないファイルデスクリプタを探す方法があるのかというと、Linux なら /proc/$$/fd/ 以下を見れば
良いんだろうが多分OSごとにやり方が違っていると思う。ということで開きファイルでスクリプタを探す方法は bash にあるんだ
ろうか? (bash でなくても良いが)。それとも探さずともシステムコールの open() 等のように空きを探し出して使ってくれる
みたいな書き方はできるんだろうか?
http://fj.hatenablog.jp/entry/2016/03/12/223319
で、リダイレクトはこの例のように 200 とか使ったのだが、しかし、これが使われていたらまともに動かないのではないかと思う。
かといって現在使われていないファイルデスクリプタを探す方法があるのかというと、Linux なら /proc/$$/fd/ 以下を見れば
良いんだろうが多分OSごとにやり方が違っていると思う。ということで開きファイルでスクリプタを探す方法は bash にあるんだ
ろうか? (bash でなくても良いが)。それとも探さずともシステムコールの open() 等のように空きを探し出して使ってくれる
みたいな書き方はできるんだろうか?
685デフォルトの名無しさん
2019/06/14(金) 22:49:46.28ID:0KPEzZXE 間違えた。開きじゃなくて空きだな。
686デフォルトの名無しさん
2019/06/14(金) 23:00:24.10ID:gXbRy3uY687デフォルトの名無しさん
2019/06/14(金) 23:05:28.80ID:gXbRy3uY Ruby のTempfile みたいな、一時ファイルでも作れば?
688デフォルトの名無しさん
2019/06/14(金) 23:21:07.72ID:kMuJFPPh689デフォルトの名無しさん
2019/06/18(火) 06:18:56.48ID:3nOE2mBA プログラム板にキチガイ降臨中!botに一晩も反応する異常さ
一般人(学校恩師)に殺害予告をしているのでスレ建て通報してください。
https://mevius.5ch.net/test/read.cgi/tech/1559872586/
142 名前:a4 ◆700L1Efzuv 投稿日:2019/06/18(火) 05:29:55 ID://qVkzO
>>141
名古屋の人な 俺ね、君の問題を大橋先生と混ぜないことにする。つまりね、
片桐孝洋のことをボコろうと思う。普通に顎の骨を折る。これくらいで警察来るか?
一般市民とかさ、普通にさ、俺らの秘密なんだけどさ、日本人なんて復活ねーから。
一般人(学校恩師)に殺害予告をしているのでスレ建て通報してください。
https://mevius.5ch.net/test/read.cgi/tech/1559872586/
142 名前:a4 ◆700L1Efzuv 投稿日:2019/06/18(火) 05:29:55 ID://qVkzO
>>141
名古屋の人な 俺ね、君の問題を大橋先生と混ぜないことにする。つまりね、
片桐孝洋のことをボコろうと思う。普通に顎の骨を折る。これくらいで警察来るか?
一般市民とかさ、普通にさ、俺らの秘密なんだけどさ、日本人なんて復活ねーから。
690デフォルトの名無しさん
2019/06/18(火) 15:03:38.59ID:3Qr44a8e shebangの書き方について教えてください。
#!/bin/sh
# Next line is comment in Tcl, but not in sh... \
exec tclsh "$0" ${1+"$@"}
( 出典: https://rosettacode.org/wiki/Multiline_shebang )
コメント解釈の違いを利用して複数行に云々は分かります。
ただ気になった箇所が...
${1+"$@"}
これは一体どういう意味合いが込められてるのでしょうか?
Tcl 以外にも Perl とかでも同様の箇所があります。
引数 $1 が unsetなら null
そうでなければ "$1" "$2" "$3" . . . って事ですよね。
それって、ただ "$@" と書くのと違いが分かりません。
ちなみに公式推奨は
man tclsh8.5 までは "$@"
man tclsh8.6 からは ${1+"$@"} になっています。ただし説明文はそのままでした。
#!/bin/sh
# Next line is comment in Tcl, but not in sh... \
exec tclsh "$0" ${1+"$@"}
( 出典: https://rosettacode.org/wiki/Multiline_shebang )
コメント解釈の違いを利用して複数行に云々は分かります。
ただ気になった箇所が...
${1+"$@"}
これは一体どういう意味合いが込められてるのでしょうか?
Tcl 以外にも Perl とかでも同様の箇所があります。
引数 $1 が unsetなら null
そうでなければ "$1" "$2" "$3" . . . って事ですよね。
それって、ただ "$@" と書くのと違いが分かりません。
ちなみに公式推奨は
man tclsh8.5 までは "$@"
man tclsh8.6 からは ${1+"$@"} になっています。ただし説明文はそのままでした。
691デフォルトの名無しさん
2019/06/18(火) 15:38:35.82ID:3Qr44a8e 良い解説があったので解決しました。
https://www.in-ulm.de/~mascheck/various/bourne_args/
スクリプトに引数を与えない場合、
一部の古いシステムでは "$@" の解釈が
nothing (何もない) ではなく "" (空文字)になってしまうからだそうです。
https://www.in-ulm.de/~mascheck/various/bourne_args/
スクリプトに引数を与えない場合、
一部の古いシステムでは "$@" の解釈が
nothing (何もない) ではなく "" (空文字)になってしまうからだそうです。
692デフォルトの名無しさん
2019/06/18(火) 15:51:31.49ID:CxecAVS8693デフォルトの名無しさん
2019/06/18(火) 16:43:58.58ID:+9W61W8S 参考までに言っておくと、>>691のリンク先にも書いてあるが、
古いzshは ${1+"$@"} は期待したとおりに動かない
完璧な解決方法は、例 eval exec tclsh "\"$0\"" ${1+'"$@"'}
古いzshは ${1+"$@"} は期待したとおりに動かない
完璧な解決方法は、例 eval exec tclsh "\"$0\"" ${1+'"$@"'}
694デフォルトの名無しさん
2019/06/18(火) 17:09:27.93ID:3Qr44a8e なるほど、勝手にアンクォートするようなドジっ子まで考慮しますか....
695デフォルトの名無しさん
2019/06/18(火) 21:39:14.68ID:ADqK1Q88 お約束
・特記なき場合,Bourne ShellもしくはPOSIX準拠のsh互換(というより再現=jシェルが質問・議論の前提です。
つまりシェルスクリプトのシバンは#!/bin/shです。
他のシェル(Bash, Zsh, Ksh, BusyBox sh, DASH, Yash, posh, fish, (t)csh)などの専用機能に依存する場合は,その旨を明示しましょう。
macOS及び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なので注意。
(t)cshでのシェルスクリプトは*まったく推奨しません*。
(参考URL: http://www.speech-lab.org/~hiroki/csh-whynot.euc)
・POSIX (Portable Operating System Interface) に準拠しましょう。
有用なリンクはhttps://en.wikipedia.org/wiki/POSIX末節などを参照。
最新の仕様はこちらへ: http://pubs.opengroup.org/onlinepubs/9699919799/
(左上の「Shell & Utilities」から各コマンドの仕様を閲覧できます。また,コマンドだけでなく,ファイルその他の仕様も閲覧できます)
・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHeirloom sh,次点でDebianなどに搭載されているDASH。
Heirloom sh: http://heirloom.sourceforge.net/sh.html
Dash shell: http://gondor.apana.org.au/~herbert/dash/
・Unixにはシェルスクリプトに便利な小さなコマンド類がいろいろあります。
「並び換え (sort(1))」「検索 (grep(1))」等々。
Manページや各種リンク(http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.htmlなど)を見ましょう。
apropos(1)ないしはman(1)の-kオプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
・特記なき場合,Bourne ShellもしくはPOSIX準拠のsh互換(というより再現=jシェルが質問・議論の前提です。
つまりシェルスクリプトのシバンは#!/bin/shです。
他のシェル(Bash, Zsh, Ksh, BusyBox sh, DASH, Yash, posh, fish, (t)csh)などの専用機能に依存する場合は,その旨を明示しましょう。
macOS及び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なので注意。
(t)cshでのシェルスクリプトは*まったく推奨しません*。
(参考URL: http://www.speech-lab.org/~hiroki/csh-whynot.euc)
・POSIX (Portable Operating System Interface) に準拠しましょう。
有用なリンクはhttps://en.wikipedia.org/wiki/POSIX末節などを参照。
最新の仕様はこちらへ: http://pubs.opengroup.org/onlinepubs/9699919799/
(左上の「Shell & Utilities」から各コマンドの仕様を閲覧できます。また,コマンドだけでなく,ファイルその他の仕様も閲覧できます)
・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHeirloom sh,次点でDebianなどに搭載されているDASH。
Heirloom sh: http://heirloom.sourceforge.net/sh.html
Dash shell: http://gondor.apana.org.au/~herbert/dash/
・Unixにはシェルスクリプトに便利な小さなコマンド類がいろいろあります。
「並び換え (sort(1))」「検索 (grep(1))」等々。
Manページや各種リンク(http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.htmlなど)を見ましょう。
apropos(1)ないしはman(1)の-kオプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
696デフォルトの名無しさん
2019/06/22(土) 11:26:37.15ID:RW0mnOsC bashしか使ったことないけど下手に汎用性を意識してshで書くと裏目に出るってことか
某原理主義者涙目だなそりゃ
某原理主義者涙目だなそりゃ
697デフォルトの名無しさん
2019/06/22(土) 14:23:45.59ID:rnpNzk5p 裏目ってなんの話?
698デフォルトの名無しさん
2019/06/22(土) 17:23:54.76ID:QCRIg0Bb 以前(といっても10年以上前)は汎用性を考えて、
ブレース展開とかを使わずに書くようなこともしてたけど、
今はもうbashベッタリな書き方をするようになったわ。
それで困ったことはなかったし。
ブレース展開とかを使わずに書くようなこともしてたけど、
今はもうbashベッタリな書き方をするようになったわ。
それで困ったことはなかったし。
699デフォルトの名無しさん
2019/06/22(土) 17:26:21.61ID:rnpNzk5p dashで動かないから困ってるんだが・・・
700デフォルトの名無しさん
2019/06/22(土) 17:48:50.05ID:7bhVGeaO macはzshになるんだってなw
701デフォルトの名無しさん
2019/06/22(土) 17:59:35.28ID:rnpNzk5p702デフォルトの名無しさん
2019/06/22(土) 20:03:08.93ID:UkgQSivT zshとの比較ではbashが遅いみたいだけど
703デフォルトの名無しさん
2019/06/22(土) 20:43:07.17ID:nLud9E0Q zshは関数呼び出しが遅いんだよね
704デフォルトの名無しさん
2019/06/22(土) 21:47:38.28ID:wZKOjh5O 2倍遅いくらい?
システムコールでのシステム内滞在(?)の方は4倍弱かかってんのね。なんらかのシステムコールの呼び出し回数が多いのか
システムコールでのシステム内滞在(?)の方は4倍弱かかってんのね。なんらかのシステムコールの呼び出し回数が多いのか
705デフォルトの名無しさん
2019/06/22(土) 21:55:26.50ID:wZKOjh5O 4倍どころじゃないなwなんだろ
706デフォルトの名無しさん
2019/06/22(土) 22:48:15.57ID:nLud9E0Q707デフォルトの名無しさん
2019/06/23(日) 00:33:42.02ID:T9PQd+F5 シェルスクリプトというより対話シェルの話題なんだけど
Kshを「業務上 仕方無く(AIX案件とか)」とかではなく使ってる人っています?
今までBashを対話シェルに使ってきたけどKshもかなり便利そうだし何より高速らしいので興味はある
公式サイト(http://www.kornshell.com/)もあってドキュメントも充実してそうだから使ってみたくはあるんだけど
実際に令和にもなってKshを常用してる人がいるのか知りたい。
Kshを「業務上 仕方無く(AIX案件とか)」とかではなく使ってる人っています?
今までBashを対話シェルに使ってきたけどKshもかなり便利そうだし何より高速らしいので興味はある
公式サイト(http://www.kornshell.com/)もあってドキュメントも充実してそうだから使ってみたくはあるんだけど
実際に令和にもなってKshを常用してる人がいるのか知りたい。
708デフォルトの名無しさん
2019/06/23(日) 01:41:24.67ID:ZvVZ9R+J bashですら「業務上 仕方無く(Linux案件とか)」、だなあ
AIXで生活できるような金持ちっているのかねw
AIXで生活できるような金持ちっているのかねw
709デフォルトの名無しさん
2019/06/23(日) 08:23:09.41ID:EWmWLeCI 私は業務上の制限がないので、自分の意志で bash を使っているけどね
不便を感じたことは一度もない
不便を感じたことは一度もない
710デフォルトの名無しさん
2019/06/23(日) 08:40:08.51ID:ZvVZ9R+J お題はkshで生活してる人は?なのにbashで不便がないとか言われても可哀想だ
711デフォルトの名無しさん
2019/06/23(日) 09:17:09.53ID:fwFAut7X for でループすると遅いから、while を使えばよい
712デフォルトの名無しさん
2019/06/23(日) 20:48:21.80ID:Hk4wLzeC シェルスクリプトで遅いと感じるのなら
それはシェルスクリプト向きではないということだ
それはシェルスクリプト向きではないということだ
713デフォルトの名無しさん
2019/06/23(日) 21:03:39.97ID:TZygGBwZ シェルスクリプトしかできないんだろう。選択肢がそれ唯一という
714デフォルトの名無しさん
2019/06/23(日) 21:54:21.81ID:WHM6Ibwm 辛くなったら違う言語にも手を伸す機会が訪れた と捉えましょう
715デフォルトの名無しさん
2019/06/23(日) 22:23:28.14ID:26vacGY+ ぼくなんか手作業より速ければそれで満足するぜ?
716デフォルトの名無しさん
2019/06/23(日) 23:30:33.10ID:qRDZMtxU テキストファイルごにょごにょするときはシェルスクリプト一択
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【野球】大谷翔平、佐々木朗希、山本由伸らがWBC辞退なら広がる不協和音… 『過去イチ盛り上がらない大会』になる可能性も★2 [冬月記者★]
- 【国際】ロシアはすでに戦争準備段階――ポーランド軍トップが警告 [ぐれ★]
- 「町中華」の“息切れ倒産”が増加 ブームにも支えられ職人技で踏ん張ってきたが… 大手チェーンは値上げでも絶好調 [ぐれ★]
- 【news23】小川彩佳アナ「ここまでの広がりになるということを、高市総理はどれだけ想像できていたんでしょうね」 日中問題特集で [冬月記者★]
- 毛寧(もう・ねい)報道官「中国に日本の水産品の市場は無い」 高市首相の国会答弁に「中国民衆の強い怒り」 ★2 [ぐれ★]
- 立民・岡田氏の質疑「不適切」 維新・藤田氏、台湾有事答弁巡り [蚤の市★]
- 4:44:44.444
- 【高市売り】円安、止まらず!凄い勢いで暴落中。157円へ [219241683]
- そもそも日本て中国に日沈む国だとか無礼な事言ってたよね
- アニメでよく日本人キャラなのに目の色だけ変えたりしてるのあるじゃん?
- 【悲報】ヤフコメ民「中国が水産物を輸入禁止にするなら、日本国民向けに安く販売すればいい。中国依存から脱するべき」 [153736977]
- 高市早苗って「わざと」日本畳んでるよな? [419865925]
