X



シェルスクリプト総合 その29

■ このスレッドは過去ログ倉庫に格納されています
0595デフォルトの名無しさん
垢版 |
2019/05/29(水) 19:32:57.87ID:UDeAAaE3
katochan -pe
0599デフォルトの名無しさん
垢版 |
2019/05/30(木) 00:44:29.88ID:nqYCZCfw
遅いからそれがなんなの?って意味なんだけど
そんなに意味がない速さにこだわるなら、なんでもかんでもCで書くべきだろうにw
0603デフォルトの名無しさん
垢版 |
2019/05/30(木) 03:17:49.10ID:nqYCZCfw
>>591は何度も繰り返すわけでもなく単なるタイマー起動するまでだけという、また、例の指定時間が1h30mという
起動するのに、0.1秒かかるのと0.01秒もしくは0.001秒でになんの差があるというのか、なんでそんなとこ気になんの?病気じゃないのってとこかな
0604デフォルトの名無しさん
垢版 |
2019/05/30(木) 19:27:13.10ID:9DfhdkhJ
>>603
同じく。
なんで一回かぎりの処理(しかも要求される精度は1分程度)に
そんなコンマ数秒の速度の違いを考慮しなくちゃならないんだろうか。
0605デフォルトの名無しさん
垢版 |
2019/06/01(土) 00:35:45.39ID:qWUYdvcJ
自分の方が賢いと思って知ったかぶりしてるだけでしょ。子供にはよくあることだよ。
ここには悪質な荒らしも来るんだから、スルーできないと荒らしの思う壺じゃないかな。
0609デフォルトの名無しさん
垢版 |
2019/06/02(日) 20:55:19.29ID:SX5hebJf
>>608
それを言うなら,お題には「プログラムの起動が遅かったらだめ」とも書いてねーよw
だからsedを使っても何ら問題ない。

↓こんなのでいいんじゃないかな?
ちょっと抜けがある(..h..mみたいな不正な指定も通してしまう)けど
自分で使うプログラムなら,これくらい入力時に注意できるから
そこまで厳密な判定は要らないと判断した。
sleep $(echo "($(echo '1h30m' | sed -e 's/\([0-9.][0-9.]\)*h\([0-9.][0-9.]\)*m/\1 * 60 + \2/')) * 60" | bc -l)
0613デフォルトの名無しさん
垢版 |
2019/06/03(月) 01:08:52.27ID:0fpHz+xZ
Ubuntu 19.04 だと

(standard_in) 1: syntax error
sleep: missing operand

となる。

echo "($(echo '1.5h' | sed -e 's/\([0-9.][0-9.]\)*h\([0-9.][0-9.]\)*m/\1 * 60 + \2/')) * 60"

が (1.5h) * 60 になるので bc でエラーになる
0614デフォルトの名無しさん
垢版 |
2019/06/03(月) 03:44:14.58ID:60TnqmAc
>>613
ドットは \ でのエスケープが必用なのでは?
0615デフォルトの名無しさん
垢版 |
2019/06/03(月) 04:14:04.85ID:xnZUjfNJ
>>592は冗長やな

echo 1h30m | { echo 'scale=0;'; sed 's/h/*3600+/;s/m/*60+/;s/s//;s/+$//;s:.*:(&)/1:'; } | bc
echo 1h30m | sed 's/h/*3600+/;s/m/*60+/;s/s/+/;s:.*:scale=0;(&0)/1:' | bc

scale=0はデフォルトだからいらんと思うけど
0616デフォルトの名無しさん
垢版 |
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)
0618デフォルトの名無しさん
垢版 |
2019/06/03(月) 05:00:32.74ID:xnZUjfNJ
仕様漏れ

・hは必須です。hを省略した場合エラーになります。30mの場合は0h30mと入力してください。
0621デフォルトの名無しさん
垢版 |
2019/06/03(月) 07:25:22.55ID:amnwC05e
>>616
> ・mが4文字以上で文字数が偶数の場合は、下位2文字のみが使用されます。(例 1234m の場合 34、12.345の場合45)
この仕様の意味ってなに?
この仕様を無視して,
「mの前の数字は2桁でなくてはならない」
という仕様に統一すれば,すごく書き易いシェルスクリプトになると思うんだけど。
0622デフォルトの名無しさん
垢版 |
2019/06/03(月) 07:29:35.13ID:amnwC05e
>>616
追加で質問。
なんでhやmの前の数字の桁数の偶奇に拘るの?
例えば,
・mの前には二桁の整数(0埋め)しか許されない
・hの前には小数点以下一位の精度で99以下の数しか許されない
という仕様のほうが,仕様も短かいし実装も簡潔になると思うんだけど。
0623デフォルトの名無しさん
垢版 |
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
0624デフォルトの名無しさん
垢版 |
2019/06/03(月) 09:09:22.60ID:8ZNdPBG6
行き当たりばったりでコードを書く人(>>609とか>>623)ってのは
お題がでたら、そのお題だけ通るコードを書く。
通らない例が現れたら、その通らない例のためのコードを追加する
別の通らない例が現れたら(以下同文
こんな感じでコードがどんどん長くなっていく

ちゃんと考えてコードを書いている人は短いコードで実現できる
物事を抽象化して考える。そのせいでいろんな場合に対応できる。
行き当たりばったりでコードを書く人は、いろんな場合に対応したら
コードが長くなると考える。だが抽象化するといろんな場合に対応し、かつコードは短くなる
0626デフォルトの名無しさん
垢版 |
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
0628デフォルトの名無しさん
垢版 |
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 すればいい)
0630デフォルトの名無しさん
垢版 |
2019/06/03(月) 09:52:56.88ID:z2LdD30j
クソコードはクソコードで終わりでいいって話
あ、クソコードですね♪使い物になりませんね♪でいいってことよ。
いちいちこういう場合にエラーがなりますとかやらなくていい
さっさと廃棄処分してしまおう。
0631623
垢版 |
2019/06/03(月) 11:22:16.99ID:8eXXlkO0
まず設計がおかしい!
バグのほとんどは、設計がおかしいから起きる

時間は、0〜24 の整数のみ。
分は、0〜60 の整数のみ

最大で、24時間までとか

整数に変換できなければ、浮動小数点に変換するとか、こんなおかしな設計はない!
0632デフォルトの名無しさん
垢版 |
2019/06/03(月) 11:25:36.69ID:8qtiF3dA
>>623 = >>631 の発言

>>623「整数に変換できなければ、浮動小数点に変換する」

>>631「整数に変換できなければ、浮動小数点に変換するとか、こんなおかしな設計はない!」
0633デフォルトの名無しさん
垢版 |
2019/06/03(月) 11:26:56.98ID:amnwC05e
>>632
やめたれw
0634デフォルトの名無しさん
垢版 |
2019/06/03(月) 12:27:27.29ID:3fU/jk6b
つまりrubyを使うと統合失調症になってしまうということ?
0636デフォルトの名無しさん
垢版 |
2019/06/03(月) 13:28:47.52ID:3fU/jk6b
やっぱりなってしまうんだね…
0637623
垢版 |
2019/06/04(火) 05:26:37.80ID://1XsOfQ
整数に変換できなければ、浮動小数点に変換するとか、明らかにおかしいでしょ?
だから、質問者に言われた通りに書いたら、おかしいと言うこと!

>>631
>時間は、0〜24 の整数のみ。
>分は、0〜60 の整数のみ

多くの言語が採用しているのは、
時間は、0〜23 の整数のみ。
分は、0〜59 の整数のみ

色んな言語の、Time クラスのメソッドを参照
0638デフォルトの名無しさん
垢版 |
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
0639デフォルトの名無しさん
垢版 |
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
0641デフォルトの名無しさん
垢版 |
2019/06/04(火) 23:40:36.15ID:91A1BNDa
>>591
最初に引数を"h"→"h "、"m"→"m "に変換するといいんじゃないかな
0642デフォルトの名無しさん
垢版 |
2019/06/05(水) 00:03:31.85ID:uJguGtrO
小数点を含んだ時刻表記(単位は時・分)を秒数に正規化する,みたいな話かね
0643デフォルトの名無しさん
垢版 |
2019/06/05(水) 01:44:13.04ID:Rs8bMd2A
練習のために書いてて、うまい書き方は無いかという話だった気がするのだが…
0644デフォルトの名無しさん
垢版 |
2019/06/05(水) 12:04:44.96ID:UTQhx3T7
だよな、単に。sedならという応えも直後にあっての
変なのが変な話に変えてる
0645デフォルトの名無しさん
垢版 |
2019/06/05(水) 12:17:13.51ID:HgsnwJuZ
質問者「今から1時間後とか、あと1.5時間後とかにも対応してみました」

Ruby厨「整数に変換できなければ、浮動小数点に変換するとか、こんなおかしな設計はない!」
Ruby厨「時間は0〜24の整数のみ! 午前1時30分のことを1.5時とか言わない!」
0646デフォルトの名無しさん
垢版 |
2019/06/05(水) 15:13:01.25ID:ufQ3ijM/
バッシュでファイル名がアスキーコードが判定する方法教えて下さい一番簡単に
アスキーコードはUTF8の一部でもあるのでnkfは確認出来ないとおもいました
0647デフォルトの名無しさん
垢版 |
2019/06/05(水) 16:22:42.00ID:ujLKUPuk
if iconv -t ASCII <<< "$filename" > /dev/null 2>&1; then

必要なら -f を。必要なら ASCII 以外の他のエンコーディングを
0648デフォルトの名無しさん
垢版 |
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:]] とかかな? 最悪一文字ずつ書けばいいだろう。
0653デフォルトの名無しさん
垢版 |
2019/06/05(水) 17:27:42.29ID:xkVLsoK0
やはりRuby厨と変わらないw
正しく動くのを示せばいいだけでしょ、勝手にa-zだけじゃなく。それがちゃんとASCIIと判定できるなら
0657デフォルトの名無しさん
垢版 |
2019/06/05(水) 17:37:01.79ID:xkVLsoK0
意味わからん。ちゃんと正しく動くのを示せばいいだけじゃん
なんでそんな妄想に走る?まあ、>>645と言っておきながらの>>648でそういうのがデフォなんだろうけど
俺はRuby厨でもなんでもないよ、ざんねん
0658デフォルトの名無しさん
垢版 |
2019/06/05(水) 17:39:55.68ID:HgsnwJuZ
だからお前と問答する必要はない話だよねw
質問者にヒントを出した。あとは自分でやるか、"質問者"が泣きつくかどうかだろ
なんでお前が泣きついてるんだ?えーんえーん(笑)
0659デフォルトの名無しさん
垢版 |
2019/06/05(水) 17:43:17.72ID:xkVLsoK0
ヒントを出した、泣きつくかどうか
よくそんな言葉吐けるな。ちょっと前のいつものヤツか、その子供のような最後といい、よく恥ずかしげもなく書けるなw
0665デフォルトの名無しさん
垢版 |
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
0666デフォルトの名無しさん
垢版 |
2019/06/05(水) 18:05:10.12ID:xpgfEjrk
>>665
そうそう。だから面倒なので「ASCIIコード以外にあてはまるかどうか調べてない」し
「最悪一文字ずつ書けばいい」
あとbashやzshって限定しなくて良いよ。全部そうだから

> bash で [:ascii:] を使う場合には
[:ascii:]はPOSIXクラスじゃない
0667デフォルトの名無しさん
垢版 |
2019/06/05(水) 18:12:43.44ID:9iVEjLSM
なんで誰も求めていないPOSIXや速さにそんなにこだわるんだかな
>>665はちゃんと前段と分けて「bash で [:ascii:] を使う場合」とも言っている=「bashで」と言っているのに、なんでそうも自分は知ってるを出したいんだか
0668デフォルトの名無しさん
垢版 |
2019/06/05(水) 18:15:02.41ID:ye33y5kG
ところが Ubuntu の dash(conform with the POSIX 1003.2 and
1003.2a specifications for the shell)は依存しないのよね…(上の例ではどちらも x を返す)
0670デフォルトの名無しさん
垢版 |
2019/06/05(水) 18:15:31.51ID:xpgfEjrk
「求めていない」と明言していない以上、
「求めていない」なんてお前が断定するなってことだよ。
0672デフォルトの名無しさん
垢版 |
2019/06/05(水) 18:21:58.87ID:9iVEjLSM
>>668
なんだろ、C Standard Libraryにそういうのがなくて各々独自実装とかかな?
POSIXで明確に文字(コード)として、これこれと規定してなくて独自判断実装とかか
0673デフォルトの名無しさん
垢版 |
2019/06/05(水) 18:29:57.26ID:9iVEjLSM
dashはプログラムでロケール(LC_CTYPE)の設定をしてない手抜きとかか。も考えられるね。どうであろうとデフォ= Cという
0674デフォルトの名無しさん
垢版 |
2019/06/06(木) 17:44:19.74ID:KuydtzNG
>>651
> 正しく動くASCII判定のをどうぞ
どうぞじゃなくて、それをやってみせる大チャンスだったのでは?
そうすることに意義があると思うならね。
0676デフォルトの名無しさん
垢版 |
2019/06/07(金) 08:04:35.63ID:rFfmCjQx
「助ける」って表現おかしくね?
だって誰も「助けてくれ」なんて言ってないじゃん。
既に質問者の「助けて」には親切な奴が答えてくれている途中だった。

正しく動くプログラムに勝手にケチ付けた挙句、なんの案も出さずに「間違ってる」だけしか言ってないよね。
0677デフォルトの名無しさん
垢版 |
2019/06/07(金) 09:02:53.19ID:wbS/xMGA
それな。

こっちは「こんな感じで作れますよー」って言ってるだけ
あとは簡単なので質問者でもできるだろう
(できないなら何かしらのレスをするだろう)

そこにいちいち、それは完璧に動かないって言うだけ。言うだけ厨w
0679デフォルトの名無しさん
垢版 |
2019/06/07(金) 23:38:40.76ID:sMkNqk8q
>>645
>Ruby厨「時間は0〜24の整数のみ!

時間と時刻が混ざってるようだな
こういう奴が仕様作成すると大変なことになる
0681デフォルトの名無しさん
垢版 |
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非公開」という時点で相手にする価値が無いしなあ…
0683デフォルトの名無しさん
垢版 |
2019/06/14(金) 14:10:08.67ID:BMAIfRwQ
まあ確かにその説明は間違ってるけど
態々Yahoo知恵袋の回答を5chに持って来てまで叩くことあるかね……。
0684デフォルトの名無しさん
垢版 |
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() 等のように空きを探し出して使ってくれる
みたいな書き方はできるんだろうか?
0686デフォルトの名無しさん
垢版 |
2019/06/14(金) 23:00:24.10ID:gXbRy3uY
>>680
そこは「くだらねえ質問」だろ

シェルスクリプトの事も書き込んでもよいけど、
シェルスクリプト専用のスレではない!
0688デフォルトの名無しさん
垢版 |
2019/06/14(金) 23:21:07.72ID:kMuJFPPh
>>684,685
空いているではなく、開いているまたは開いていないならわかりそうだが
: >&200
しかし、なんで012以外をも直値にしたんだろうね
0689デフォルトの名無しさん
垢版 |
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
名古屋の人な 俺ね、君の問題を大橋先生と混ぜないことにする。つまりね、
片桐孝洋のことをボコろうと思う。普通に顎の骨を折る。これくらいで警察来るか?
一般市民とかさ、普通にさ、俺らの秘密なんだけどさ、日本人なんて復活ねーから。
0690デフォルトの名無しさん
垢版 |
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+"$@"} になっています。ただし説明文はそのままでした。
0691デフォルトの名無しさん
垢版 |
2019/06/18(火) 15:38:35.82ID:3Qr44a8e
良い解説があったので解決しました。
https://www.in-ulm.de/~mascheck/various/bourne_args/

スクリプトに引数を与えない場合、
一部の古いシステムでは "$@" の解釈が
nothing (何もない) ではなく "" (空文字)になってしまうからだそうです。
0693デフォルトの名無しさん
垢版 |
2019/06/18(火) 16:43:58.58ID:+9W61W8S
参考までに言っておくと、>>691のリンク先にも書いてあるが、
古いzshは ${1+"$@"} は期待したとおりに動かない
完璧な解決方法は、例 eval exec tclsh "\"$0\"" ${1+'"$@"'}
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況