
それで、hh:mm:ss(24時間形式)で時間を取り、その時間までタイマーを作るbash関数を作ってみようかと思いました。
残り時間を知らせるワンタイム目覚まし時計に似ています。
watch
これを行うためにコマンドを使用するつもりです
これを行う方法についていくつかの質問があります。
まず、bashを使用して特定の時間より前に残った金額をどのように知ることができますか?
それでは、画面に再び表示されるように人間が読める形式に変換するにはどうすればよいですか?
また、過剰または将来の他の日にどのようにこれを行うことができますか?
この機能の作成に役立つ場合は、すべてのユーザーが利用できるように最終結果をここに投稿します。
編集:私はこれを得ることができました協会出版社:@terdon
timer ()
{
start="$(date +%s -d $1)";
while [ "$start" -ge $(date +%s) ]; do
days="$(($(($(( $start - $(date +%s) )) * 1 )) / 86400))";
time="$(( $start - `date +%s` ))";
if [ $days -gt 0 ]; then
printf '%s day(s) and %s\r' "$days" "$(date -u -d "@$time" +%H:%M:%S)";
else
printf '%s\r' "$(date -u -d "@$time" +%H:%M:%S)";
fi;
sleep 0.1;
done
}
すべての引数が引用符内にあるにもかかわらず、date -d $ 1が複数の単語引数を受け入れられないという問題に直面しました。私はUbuntuを使用しており、bashを使用しています。これがテスト用に実行したコードです。ご覧のとおり、引用符のない最初の単語の後に続く内容を無視し、引用符があるとエラーが発生します。
$ timer 17:25
00:04:37
$ timer sun
1 day(s) and 06:39:31
$ timer sun 17:25
1 day(s) and 06:39:20
$ timer sun 22:25
1 day(s) and 06:39:09
$ timer "sun 22:25"
date: extra operand ‘22:25’
Try 'date --help' for more information.
bash: [: : integer expression expected
答え1
-dオプションを使用すると、dateコマンドに複数の単語引数を渡すのに問題があるようです。この問題を解決するには、内部フィールド区切り文字(IFS)変数を使用して引数を解析するときにシェルが使用する区切り文字を一時的に変更できます。以下は、複数の単語引数を処理するように関数を変更する方法の例です。
timer ()
{
IFS=":" read -ra time_parts <<< "$1"
time_str=""
for part in "${time_parts[@]}"; do
time_str+=" $part"
done
start="$(date +%s -d "$time_str")";
while [ "$start" -ge $(date +%s) ]; do
days="$(($(($(( $start - $(date +%s) )) * 1 )) / 86400))";
time="$(( $start - `date +%s` ))";
if [ $days -gt 0 ]; then
printf '%s day(s) and %s\r' "$days" "$(date -u -d "@$time" +%H:%M:%S)";
else
printf '%s\r' "$(date -u -d "@$time" +%H:%M:%S)";
fi;
sleep 0.1;
done
}
これにより、「sun 22:25」などの複数の単語引数を関数に渡し、dateコマンドがそれを正しく解析することができます。
他の質問については、date -dコマンドを使用して特定の時間までの残り時間を確認し、次のコマンドを使用できます。
日付 -u -d "@$time" +%H:%M:%S
人間が読める形式に変換します。
過度に、または将来の他の日に追加したい場合は、日付を追加することもできます。
日付 -u -d "2022-12-25 22:25" +%s
これにより、指定した日付と時刻のタイムスタンプが提供されます。