可変的な行動

可変的な行動

始める前に、私はちょうどインスピレーションと私が持っている行動のためにコードを書くのではありません。このコードがあります。

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

変数の値をx1に設定します。新しい値を割り当てない限り、値は変更されません。

するとき

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

関連情報