가변적인 행동

가변적인 행동

시작하기 전에 단지 영감과 내가 가진 행동을 위해 코드를 작성하라는 것이 아닙니다. 이 코드가 있습니다.

NOW=$(date +"%H")
While [ true ]; do
 echo $NOW
done

나는 날짜 명령을 저장하고 NOW 변수에 형식을 지정했기 때문에 화면에 인쇄할 때 시간이 업데이트되기를 바랐지만 스크립트가 시작된 것과 동일한 날짜를 계속 인쇄하는 것뿐입니다. 왜 이런 일이 일어나는지 말해 줄 수 있는 사람이 있나요?

답변1

그래야 하는 것처럼 동작합니다. 당신이 원하는 것은 다음을 통해 달성될 수 있습니다:

while [ true ]; do
    NOW=$(date +"%H")
    echo $NOW
done

이제 이 변수는 루프가 반복될 때마다 업데이트됩니다.

두 가지를 다음과 비교해보세요.

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

관련 정보