Bash 명령 대체가 작동하지 않습니다

Bash 명령 대체가 작동하지 않습니다

스크립트는 다음과 같습니다.

#!/bin/bash

thedate=$(date)


var='Current date is $thedate'

echo $var

출력은 현재 날짜가 $thedate이고 날짜를 표시하도록 하고 싶습니다. 내가 뭘 잘못했나요? 어떤 도움이라도 주시면 감사하겠습니다.

답변1

문제는 bash를 사용하지 않는 한 환경 변수를 한 번만 확장한다는 것입니다. eval이로 인해 명령줄이 두 번 구문 분석됩니다.

eval echo $var

표시된 날짜와 시간은 참조된 thedate시점이 아니라 설정된 시점의 현재 날짜 및 시간입니다 $var. 참조될 때 현재 시간을 표시하려면 $var다음이 필요합니다.

var='Current date is $(date)'
eval echo $var

변수를 사용하지 않고 함수를 정의하는 것이 더 좋습니다.

cdate() { echo Current date is $(date); }
...
cdate

물론 을 사용하지 않는 것이 더 좋지만 echo, date추가 텍스트를 추가하도록 놔두세요.

cdate() { date +"Current date is %c"; }

이는 기본값과 동일한 형식을 출력하지 않지만 date기본값에 대한 형식 지정자는 없습니다.

답변2

var='Current date is $thedate'

변수는 작은따옴표 내에서 확장되지 않으므로 리터럴 텍스트를 포함하는 문자열이 할당됩니다 $thedate. 변수를 확장하려면 여기서 큰따옴표를 사용해야 합니다.

echo $var

또한 여기서는 변수 주위에 큰따옴표를 사용하여 단어 분할 및 경로 이름 확장(예: )이 적용되는 것을 방지해야 합니다 echo "$var". 이 특별한 경우에는 날짜에 와일드카드 문자가 포함되지 않을 것이므로 따옴표를 사용하지 않고도 대부분 문제를 해결할 수 있습니다. 그러나 따옴표가 없으면 예를 들어 날짜 문자열은 Fri Dec 7 20:41:21 EET 2018로 출력됩니다 Fri Dec 7 20:41:21 EET 2018. 즉, 월 이름 뒤의 이중 공백이 단일 공백으로 축소됩니다.

답변3

작은따옴표 대신 큰따옴표를 사용하세요. Bash는 작은따옴표로 묶인 변수를 확장하지 않습니다.

관련 정보