始める前に、私はちょうどインスピレーションと私が持っている行動のためにコードを書くのではありません。このコードがあります。
NOW=$(date +"%H")
While [ true ]; do
echo $NOW
done
私は日付コマンドを保存してNOW変数に書式設定したので、画面に印刷するときに時間が更新されることを望んでいましたが、スクリプトが開始されたのと同じ日付を印刷し続けるだけです。なぜこれが起こるのか教えてくれる人がいますか?
答え1
そうする必要があるように動作します。あなたが望むことは以下によって達成することができます:
while [ true ]; do
NOW=$(date +"%H")
echo $NOW
done
この変数はループが繰り返されるたびに更新されます。
2つを以下と比較してみてください。
NOW=date
while [ true ]; do
$NOW
done
コマンド自体が結果ではなく変数に格納されるため、ここで日付は繰り返されるたびに再計算されます。
答え2
ㅏ変える値は割り当てられたときに割り当てられます。
例えば
x=1
変数の値をx
1に設定します。新しい値を割り当てない限り、値は変更されません。
するとき
NOW=$(date +"%H")
その後、シェルはdate
コマンドを実行し、結果をNOW
変数に保存します。繰り返しますが、新しい値を割り当てないと値は変わりません。これがdate
外部コマンドであることは重要ではありません。一度変数に値が割り当てられたとき。
したがって、ループ内に値を割り当てる必要があります。または機能を使用してください。
NOW()
{
date +"%H"
}
これは変数を定義するのではなく、関数を定義します。これでループで使用できます
while [ true ]; do
echo $(NOW)
done
呼び方が違うので参考にしてください。
この制限がある場合は、次のように簡単にすることができます。
while [ true ]; do
NOW
done
だから最終スクリプトは
#!/bin/bash
NOW()
{
date +"%H"
}
while [ true ]; do
NOW
done