一連のタイムスタンプを生成し、最大制限と比較したいと思います。これを確認するためにwhileループを使用したいと思います。
ここに私のコードがあります。
start_ts='2021-08-07 15:00:00'
end_ts='2021-08-10 05:00:00'
while [ "$start_ts" > "$end_ts" ]
do
echo $start_ts
start_ts=$(date -ud "$start_ts +0 + 30 minutes" +'%Y-%m-%d %H:%M:%S')
done
$end_ts
しかし、そのサイクルは価値で止まることなく続きます。
私は何を逃したことがありませんか?
答え1
[ ... ]
引用符なしで一緒に使用すると、>
リダイレクト演算子です。これは、コマンド出力をファイルにリダイレクトすることによって生成された2021-08-10 05:00:00
現在のディレクトリに名前付きファイルがあることを意味します。[
注文する
[ "$start_ts" > "$end_ts" ]
次のように書くこともできます。
[ "$start_ts" ] >"$end_ts"
(例えばこのコマンドはどのように合法ですか? ">ファイル1 <ファイル2猫")。これは文字列が"$start_ts"
空でないことを確認するテストであり、このテストの出力(何も[
出力されないので何もない)がファイルにリダイレクトされます$end_ts
。
併用する[[ ... ]]
場合>
文字列比較演算子両方の文字列が特定の方法でソートされているかどうかをテストします。これはおそらくあなたが使用したいものですが、正しいロジックを得るには、を使用するか、パラメータを変更するか、代わりに <
使用>
できます。until
while
別のアプローチは、文字列比較を完全にスキップし、代わりにUnixタイムスタンプの整数比較を使用することです。
start_ts=$( date -d '2021-08-07 15:00:00' +%s )
end_ts=$( date -d '2021-08-10 05:00:00' +%s )
while [ "$start_ts" -lt "$end_ts" ]; do
printf '%(%Y-%m-%d %H:%M:%S)T\n' "$start_ts"
start_ts=$(( start_ts + 1800 ))
done
date
ループ内にGNU呼び出しがないため、元のコードよりも数倍速く実行されます(私のシステムでは約50倍高速です)。