시작하기 전에 단지 영감과 내가 가진 행동을 위해 코드를 작성하라는 것이 아닙니다. 이 코드가 있습니다.
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
변수의 값을 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