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

■ このスレッドは過去ログ倉庫に格納されています
2020/11/24(火) 21:37:20.06ID:mbTiTj6s
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。

前スレ: シェルスクリプト総合 その34
https://mevius.5ch.net/test/read.cgi/tech/1597990675/
2020/11/27(金) 23:08:59.63ID:W+zDVYCR
このスレの「総合」の看板を下ろさないと。
2020/11/27(金) 23:10:11.01ID:0Fqhj3Tv
POSIXシェルスクリプト総合にすればOK
2020/11/27(金) 23:21:59.20ID:W+zDVYCR
POSIXシェルスクリプト専用だろ?
何が総合だ。看板に偽りあり!
2020/11/27(金) 23:27:25.30ID:OZT1ua32
>>43
Awkを入れたらPerlも入るぞ?
Perlが入ったらPythonも入るぞ?
Pythonが入ったらRubyも入るぞ?

と際限がなくなりそうだけどなあ。
2020/11/27(金) 23:30:37.47ID:OZT1ua32
>>50
POSIXそのものなのか?準拠は?拡張は?と、それはそれでややこしい。w

こまけえことは気にすんな!でええがな。
POSIXバカは無視で。
2020/11/28(土) 01:07:03.95ID:UNKiK/L1
>>47
これ人が集まらないようわざと分かりにくいタイトルにしてるだろ

どんだけ陰険なん
2020/11/28(土) 01:17:29.82ID:u/XOSRZ8
>>51
すぐそうやって極論に持って行く。
「AWK程度なら」の意味分かってんの?
2020/11/28(土) 01:17:44.10ID:u/XOSRZ8
>>53
さすがに被害妄想
2020/11/28(土) 01:36:29.48ID:Qftrz3Vi
>>54
極論じゃないやろ。
むしろおまえこそ自分の言葉の意味がわかってんのかと。
2020/11/28(土) 02:08:28.38ID:iJr35ATc
awkの話もシェルスクリプトといことでいいですよね?

awkで作られた3Dシューティングゲーム「awkaster」が凄い
https://www.softantenna.com/wp/software/awkaster/

このコードを説明してください
2020/11/28(土) 02:12:15.88ID:iJr35ATc
別にawk程度ならこのスレで扱っても構わないでしょう?w
2020/11/28(土) 02:51:11.97ID:9ywhOEJN
>>57
>このコードを説明してください

いくら払うの?
まずはそこからだ
2020/11/28(土) 02:56:35.29ID:iJr35ATc
はらうわけないやろw
2020/11/28(土) 04:11:09.88ID:qjJxpluv
>>60
キチガイすぎだ、お前は
62デフォルトの名無しさん
垢版 |
2020/11/28(土) 10:42:20.87ID:PixgrLNy
>>53
確かにこれはひどい悪意を感じるので
立て直したほうがよい
2020/11/28(土) 12:09:11.41ID:FGpMIdZG
>>39
PowerShell でもそうだけど、$_ は、前段のパイプから渡ってくるもの。
1行ずつ渡ってくるのを、そのまま表示している

1-liner では、よく使う
2020/11/28(土) 12:24:11.90ID:u/XOSRZ8
>>62
自演乙
2020/11/28(土) 12:27:00.82ID:u/XOSRZ8
だいたい,「分かりやすいタイトル」にしたところで人が集まるような話題じゃねーしなw
Fishだけ知っててBash知らない,みたいな人間なんて超希少だろうし,
大半の人間はFishの前にBashを知っていて,
シェルスクリプトとして書く場合はBashを使う。
だから「Fishでこんな処理を書きたいんだけど」という疑問の前に
Bashを使うんだわ,残念ながら。

まあBashを使うことが良いこと≠ゥ,というのはまた別の話な。
勘違いしてつっかかってくる奴がいそうなんで,念の為言っておくが。
2020/11/28(土) 15:43:45.81ID:RWbEaHwZ
PowerShellやコマンドプロンプトはシェルスクリプトがなかった
Windowsの世界で使わざるを得ないものだから、それでスクリプト書くことはあるけど
fishとか書かないよね

書けるやつはbashかPOSIX準拠で書くし
書けないやつはPythonとかの言語を使う
bash書くのだるいからfishでとかやるやつがいない

fishとかプロンプトからの入力に使うだけでしょ
使ってる人もデフォルトの補完便利だねぐらいにしか思ってない
2020/11/28(土) 15:52:04.59ID:/h72lCnp
fishのスクリプトの具体的なことは未だに全く書かれていない、どう書いたらいいとかさえも
最初に言い出したやつさえ使ってないだろうw いつまで引っ張ってるんだか
2020/11/28(土) 17:30:07.45ID:P/o6eg3s
マイナーな話題は許さんのだったら総合の看板下ろせ
2020/11/28(土) 17:49:02.21ID:FGpMIdZG
AWS のCodeDeploy には、sudo yum install ruby
と書いてあるから、Ruby製

CloudFormation では、Ruby製のChef, Cookpad製のItamae, Kumogata2 を使える

バックエンドの環境構築運用では、
複雑なものは、シェルスクリプトよりも、Rubyで書く
2020/11/28(土) 18:12:07.68ID:u/XOSRZ8
>>68
もうこれに尽きるな。
Fishシェルのことを扱う別のスレを建てるんじゃなくて,
POSIXシェルのシェルとしての機能(for文, set命令とか)のみを
扱う専門スレを建てればいい。

「総合」とある以上,ここでは前者を含んだ話題を扱うべきだ。
71デフォルトの名無しさん
垢版 |
2020/12/01(火) 08:36:50.52ID:2728+f2c
dateコマンドで「今日の10時」などではなく「次に来る10時」を求める方法をご存知の方教えてください!
2020/12/01(火) 10:32:35.01ID:XcHTxxjN
date?おいやめろ。またPOSIXの話になるじゃねーか!
2020/12/01(火) 12:42:30.34ID:WP+WGTcn
文字列での表示は出来るけど、
プログラミング的な時間オブジェクトの比較とかは、出来ないかも

Ruby などのプログラミング言語なら、時間オブジェクトで比較できる

date --iso-8601=hours --date='15:00 today'
2020-12-01T15+09:00

date --iso-8601=hours --date='15:00 next day'
2020-12-02T15+09:00
7473
垢版 |
2020/12/01(火) 12:48:04.25ID:WP+WGTcn
現在・今日・明日の文字列で、文字列として比較できるかも知れない

date --iso-8601=seconds
2020-12-01T12:44:54+09:00

date --iso-8601=seconds --date='15:00 today'
2020-12-01T15:00:00+09:00

date --iso-8601=seconds --date='15:00 next day'
2020-12-02T15:00:00+09:00
7573
垢版 |
2020/12/01(火) 12:52:06.65ID:WP+WGTcn
>>74
今日が現在よりも前なら、明日

それ以外は、今日
7673
垢版 |
2020/12/01(火) 14:53:07.28ID:WP+WGTcn
bash 限定で。
zsh では、[ $today \< $now ] が動かないとか、どこかのサイトに書いてあったので

#!/bin/bash

# 現在・今日・明日の文字列
now=`date --iso-8601=seconds`
today=`date --iso-8601=seconds --date='14:00 today'`
tomorrow=`date --iso-8601=seconds --date='14:00 tomorrow'`

# echo $now # 2020-12-01T14:41:29+09:00
# echo $today # 2020-12-01T14:00:00+09:00
# echo $tomorrow # 2020-12-02T14:00:00+09:00

# 今日が現在よりも前なら、明日。
# それ以外は、今日
if [ $today \< $now ]; then
echo '明日'
echo $tomorrow # 2020-12-02T14:00:00+09:00
else
echo '今日'
echo $today
fi
2020/12/01(火) 17:23:30.11ID:sVIjNcb4
>>71
YYYY MM DD HH フォーマットを返すようにしてdateを呼び出す

if [ HH < 10 ]; then
 echo YYYY MM DD 10 00 00
else
echo YYYY MM DD+1 10 00 00
fi

あとよろ

DDが月末だったら問題あるから気をつけな
2020/12/01(火) 17:39:46.39ID:gqqffooe
>>77
10時を過ぎても11時までなら今日の10時が返されるんじゃ?
2020/12/01(火) 17:50:56.66ID:sVIjNcb4
うん、あとよろw
2020/12/01(火) 17:52:38.86ID:sVIjNcb4
思ったんだがシェルスクリプトって日付の計算ができないんだな
そういうライブラリってないのか?
2020/12/01(火) 18:03:57.84ID:/3zv7uXC
数字の計算はシェルスクリプト向けではないなあ
2020/12/01(火) 18:09:45.30ID:XaSziyAo
シェルスクリプトで数字の計算は普通にできるやろ?

rubyとかpythonとか便利ライブラリ盛りだくさんな温室で
育ってきたやつは知らんだろうけど
C言語だって日付の計算はできないんだぞ

ライブラリを作るか使うかしてやっと実現できること
ライブラリを誰かが用意してくれなきゃプログラミングができないとか
技術力もほんと落ちたもんだわw
2020/12/01(火) 18:28:45.10ID:xl/Y0HIa
>>71
tz=JST-9; [ $(date +%H) -ge 10 ] && tz=JST-23;echo $(TZ=$tz date +%D) 10:00
2020/12/01(火) 18:31:08.89ID:xl/Y0HIa
>>83
tz=JST-9; [ $(date +%H) -ge 10 ] && tz=JST-33;echo $(TZ=$tz date +%D) 10:00
だな。ぼーっとしてた
2020/12/01(火) 20:27:54.30ID:vbtVJLvD
>>84
これでいいわな。核心部分は%Hと10の比較だけ。
2020/12/01(火) 22:04:55.51ID:JidlBL+f
>>82
> シェルスクリプトで数字の計算は普通にできるやろ?

外部コマンド呼ばないとできないよね。あ$(())とかのこと? でも伝統的には...

> ライブラリを誰かが用意してくれなきゃプログラミングができないとか

日付の処理とかいろいろ落とし穴が多いから。

今はプログラムも複雑になったし... 料理に例えると、大昔は火を起こすところから
できないと駄目だったろうが今はそんなこと要求されないw
2020/12/01(火) 22:56:51.43ID:C5mmwJjK
GNUやBSDのdateの拡張部分、つうてもある値(文字列な日付も含む)を日付に変換っていう部分を使えば普通に日付の計算は(簡単に)できるだろう
日付の計算はシリアルな値=ある起点(OSやフレームワークによる)からの秒数 をベースでやるのが普通。落とし穴を避けるためにも(他の言語でも)
年月日で計算する必要のあるのは、落とし穴なんて関係ない単純な場合なだけだろう。何年何ヶ月 とか ある程度適当でいい場合とか
2020/12/01(火) 23:04:11.24ID:uBfLZ+08
しかし、そういうときはさすがにPerlだな。w
2020/12/01(火) 23:34:27.84ID:sWsOqT7L
>>86
> 外部コマンド呼ばないとできないよね。あ$(())とかのこと? でも伝統的には...
伝統?いつまでも古代のBourne shellなんか使ってるなよ
今は令和の時代だぞ?1988年(ksh88)はもう30年以上前だ。
そんな昔のシェルをお前は今も使ってるのか?
いい加減POSIX準拠シェルに乗り換えろ
90デフォルトの名無しさん
垢版 |
2020/12/01(火) 23:35:29.20ID:8hFs+PyJ
>>71です
みなさんありがとうございます助かりました!
2020/12/01(火) 23:40:19.72ID:sWsOqT7L
>>87
> 日付の計算はシリアルな値=ある起点(OSやフレームワークによる)からの秒数 をベースでやるのが普通。

date +%s はPOSIX準拠ではない
2020/12/01(火) 23:54:59.72ID:vbtVJLvD
別にPOSIXに従ってなくても,元の質問が解決すればそれでいいと思うんだが。

ちなみにPOSIXに準拠した場合でもUNIX時刻は算出できる。
2020/12/01(火) 23:55:29.58ID:vbtVJLvD
しかもThe Open Groupが直々にコードを書いてくれてるっていうw
2020/12/02(水) 00:02:02.37ID:FOy3G1VC
また頓珍漢にPOSIX準拠と言い出してるのかw
2020/12/02(水) 00:18:08.63ID:2qveoeUZ
POSIXバカはスルーで!
興味がある人のみ反応すれば。
2020/12/02(水) 01:03:04.87ID:eXK3SZJl
>>93
ないぞ?
https://pubs.opengroup.org/onlinepubs/009695399/utilities/date.html
2020/12/02(水) 01:11:52.81ID:s/Tj40p5
名前に反して自らの排外的な殻に閉じ籠ってる団体
2020/12/02(水) 01:31:58.00ID:fE08etha
POSIXバカと呼び名通りにすぐにバカっぷりを体現してくれる呼び名に偽りはないなw
2020/12/02(水) 04:20:55.77ID:eXK3SZJl
などと文句をいうだけ
10073
垢版 |
2020/12/02(水) 13:32:26.78ID:vDg6xkSY
>>76
を改良した。
2020-12-02T14:00:00 のような文字列で比較している

#!/bin/bash

time='14:00' # 求める時間

# 現在・今日・明日の文字列。年月日-時分秒。2020-12-02T14:00:00
now=`date +%Y-%m-%dT%H:%M:%S`

today=`date +%Y-%m-%dT%H:%M:%S --date="$time today"`
tomorrow=`date +%Y-%m-%dT%H:%M:%S --date="$time tomorrow"`

# 今日が現在よりも前なら、明日。
# それ以外は、今日

if [ $today \< $now ]; then
echo '明日'
echo $tomorrow #
else
echo '今日'
echo $today
fi
2020/12/02(水) 18:18:18.22ID:jOtugkoA
now=$(date +%Y%m%d %H%M%S)
date=${now# *
20201202 181521
4294967296
2020/12/02(水) 18:18:53.41ID:jOtugkoA
すまんw 途中で書き込んでしまったw
2020/12/02(水) 18:28:48.81ID:jOtugkoA
やっぱ面倒になった >>84でいいやw
2020/12/02(水) 20:24:18.38ID:aGDRVZCV
>>96
なんでそこしか見てないの?
UNIX時刻の定義に書いてある。
は〜,これだからクレクレは困るんだよなぁ……
ちっとは他のページも調べればどうだ。
2020/12/02(水) 21:09:12.29ID:2qveoeUZ
じゃあそれをはれよ
2020/12/03(木) 00:15:40.19ID:qzOIs4Mf
>>105
POSIXバカはスルーするんじゃなかったんか?
それともスルーできないくらい有用な書き込みだったかw
2020/12/03(木) 00:54:27.06ID:7EFKRkup
>>106
POSIXバカである行為と人物は異なる。
2020/12/03(木) 01:29:53.30ID:JqlpTbiL
それでUNIX時刻の定義とはどこ?
2020/12/03(木) 01:41:47.93ID:JqlpTbiL
epoch time、unix timeどちらでも調べたがやっぱりないな
2020/12/03(木) 08:47:14.88ID:qzOIs4Mf
>>109
ほんとに調べた???
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_16
2020/12/03(木) 10:16:47.14ID:cLjLRJP8
優しいなw
2020/12/03(木) 11:24:39.60ID:8fqR7feq
>>110
POSIXに手抜きするなって言っておけ
2020/12/03が2020/01/01から何日目であるかの計算式も書けとw
11373
垢版 |
2020/12/03(木) 12:16:58.37ID:Nwj1NL2r
>>100
を改良した。
date +%Y-%m-%dT%H:%M:%S を、3回使うので、変数に代入してから使う

#!/bin/bash

time='12:00' # 求める時間

# 現在・今日・明日の文字列。年月日-時分秒。2020-12-02T14:00:00
com='date +%Y-%m-%dT%H:%M:%S'

now=`$com`
today=`$com --date="$time today"`
tomorrow=`$com --date="$time tomorrow"`

# 今日が現在よりも前なら、明日。
# それ以外は、今日

if [ $today \< $now ]; then
echo '明日'
echo $tomorrow
else
echo '今日'
echo $today
fi
2020/12/03(木) 12:51:14.44ID:8fqR7feq
>>113
dateの呼び出しなら理屈上1回でやれるだろ?
現在の日時から、今日の10時、明日の10時を計算するだけやで?
2020/12/03(木) 12:57:17.10ID:kewMsHSW
POSIXといえば、>>113はデフォのdateがGNUのdateな環境用だね。
いろいろ機能拡張されているみたいで。
2020/12/03(木) 13:02:33.47ID:kewMsHSW
あいろいろと言ってもこの場合は--dateオプションだけど
2020/12/03(木) 14:57:00.63ID:U4KcZC74
>>112
dateコマンドで取得できるだろ。もちろんC関数でもな
2020/12/03(木) 15:05:53.69ID:8fqR7feq
>>117
現在日時の場合はね
俺が言ってるのは任意の日付を扱えないという話
2020/12/03(木) 15:07:46.18ID:U4KcZC74
>>114
現在の取得と明日を求めるのをお任せで2回は必要じゃね
明日を計算するのをうだうだ書くなら別だが
2020/12/03(木) 15:11:33.39ID:U4KcZC74
>>118
なるほど
あれは見てわかるようにCでのことだからな、Open Groupに言っても鼻で笑われるだけかとw
2020/12/03(木) 15:15:27.80ID:3lw1+h2j
>>119
現在の日時から今日の10時は計算できるし
明日の10時も計算できる
今日の10時に86400秒足せば、明日の10時だ
2020/12/03(木) 15:19:57.28ID:U4KcZC74
>>121
w
86400秒足したのを何月何日にするのにどうするつもりなの?
簡単に言えば、月末の次の日って話だぞ
2020/12/03(木) 15:28:04.68ID:3lw1+h2j
> 86400秒足したのを何月何日にするのにどうするつもりなの?

え?POSIXにその計算式があるんじゃなかったの?w
2020/12/03(木) 15:29:22.13ID:U4KcZC74
>>123
それ、マジで言ってるの?マジなら何もわかってないってことになるぞw
2020/12/03(木) 15:54:45.26ID:3lw1+h2j
>>124
中身がないレスはしなくていい
2020/12/03(木) 15:58:19.12ID:U4KcZC74
>>125
>>123のレスに中身があるとでも?w
そういうレスするのはいつものやつかwなるほど通りでバカなこと言うわけだ
2020/12/03(木) 16:01:23.95ID:3lw1+h2j
中身がないレスをお前が先にしたわけで、
それに対するレスにも中身が無いのは当然じゃん
早くPOSIXにその計算式はないって言いなよw
2020/12/03(木) 16:02:58.72ID:3lw1+h2j
あとはっきり言っておくな
POSIXにあるのは年月日時分秒からの変換ではなく
年日時分秒からの変換。月がない。
2020/12/03(木) 16:06:05.70ID:U4KcZC74
>>127
イミフ
>>119の通りだと今でも思うよ
それに対してなんか不思議なこと言ってるから、>>122とちゃんとした疑問なんだけどなあ
それが>>123なのか...マジで...

ないも何もそんな計算があるなんて誰が言ったんだか?どれのこと?w
2020/12/03(木) 16:07:32.44ID:U4KcZC74
>>128
むちゃくちゃww
はっきり言っておくとかwwマジキチかよと思わせるぞ
2020/12/03(木) 16:08:37.33ID:3lw1+h2j
もう話の流れを忘れたのか?

↓無理やろ

> 日付の計算はシリアルな値=ある起点(OSやフレームワークによる)からの秒数 をベースでやるのが普通。
2020/12/03(木) 16:17:23.67ID:U4KcZC74
>>131
お前は根本的に何もわかってないんだな
だからそんな勝手な話の流れと思ってるのか。そこに書かれてることも全くわかってないんだな
そこに計算なんて書いてないだろうに。お前が全く話の流れをわかってないのが明らかだ

>>119なんて言ってたくせにw またごまかしなんだろうが、無理すぎw
2020/12/03(木) 16:19:47.96ID:U4KcZC74
>>132
>計算なんて書いてない
なんか全く不可解なことを言い出してる>>123の計算ね
2020/12/03(木) 16:22:27.43ID:3lw1+h2j
> 日付の計算はシリアルな値=ある起点(OSやフレームワークによる)からの秒数 をベースでやるのが普通

が真なら

86400秒足せばOKだろw
2020/12/03(木) 16:25:05.27ID:U4KcZC74
>>134
何を言っているのか...キチガイなのかとこわ
お前にはなんか知らんがOKなんだろうが、お前が注文つけた先では全くOKじゃないだろう、年月日を出したいらしいからな
残念だったな
2020/12/03(木) 16:26:23.68ID:3lw1+h2j
だからPOSIXじゃ明日の10時の年月日が出せないと言ってるんだが
2020/12/03(木) 16:30:21.85ID:U4KcZC74
>>136
>>119って始めたくせによく言うよw
何とか誤魔化そうとしてるみたいだけど、お前は本当にゲスいなw
2020/12/03(木) 16:31:40.83ID:U4KcZC74
>>132,137
>>119は俺じゃねえかw
>>114の間違い
2020/12/03(木) 16:33:17.90ID:3lw1+h2j
だからできるだろ
日付の計算はシリアルな値でやるんだからw
2020/12/03(木) 16:38:34.33ID:U4KcZC74
もう全くわかってませんという自己紹介はいらんぞw
ちなみに、今日(今)の明日(というかどこまでかはわからんが、何時間/何日前後) の年月日はPOSIXでもトリッキーにできそうなのは上にあるだろに
2020/12/03(木) 17:37:06.10ID:Glofd6fS
>>113
変数に代入するのはformat指定だけにして
$(date “$format”)とか$(date +”$format”)にしたほうが
何をやってるかわかりやすくていい気がする

あと>>84とかと同じで0時またぎの微妙なタイミングで明後日になる可能性がある
それを把握した上で使う分には問題ないだろうけど
2020/12/03(木) 19:26:57.20ID:3lw1+h2j
>>141
> あと>>84とかと同じで0時またぎの微妙なタイミングで明後日になる可能性がある

なるほど。日付の取得は1回にしてあとは計算したほうが良さそうだな。
2020/12/04(金) 00:45:50.04ID:ECFKf8K5
>>121
いや,date(1)の呼び出しは一回で済むでしょう。
POSIXに拘ろうが拘らまいが,「ある瞬間の24時間後」
を知りたければUNIX時刻と普通の時刻を変換すればいい。

ちなみに「UNIX時刻はPOSIXのdateコマンドでは出せない/変換できない!」
って思ってる人も居そうだが,普通にできる。
2020/12/04(金) 01:18:58.36ID:iavYwWUx
Dateとして一回Calendarとして一回、二回は必要だろう
元のはCalendarとして二回使ってる感じかな
何言っているかわからんだろうけど
2020/12/04(金) 01:24:55.12ID:HyuHUD7c
>>143
> を知りたければUNIX時刻と普通の時刻を変換すればいい。
どうやって?
2020/12/04(金) 01:25:29.92ID:HyuHUD7c
>>143
> ちなみに「UNIX時刻はPOSIXのdateコマンドでは出せない/変換できない!」
できるのは、dateコマンドからUNIX時間への変換だけですよね?
2020/12/04(金) 01:48:29.11ID:HyuHUD7c
>>144
POSIXにはCalender(笑)の機能なんてないですもんねw
自分が使える言語に固執してないで、dateコマンド用語で話をするように
2020/12/04(金) 01:59:44.65ID:8vYOAEQt
論より証拠というやつで、実際にスクリプトを書いてみたらいいんだ
で書けたらそれを貼る、書けなかったらごめんなさいする
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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