이 변수 할당에 사용될 때 내 bash 변수가 확장되지 않는 이유는 무엇입니까?

이 변수 할당에 사용될 때 내 bash 변수가 확장되지 않는 이유는 무엇입니까?

사용할 작은 스크립트를 작성 중입니다 rsync. 변경 가능한 문제에 봉착했습니다.

  • 나는 폴더가 있습니다: , 폴더 가 /home/folder_1/있고 이 폴더는 매일 추가됩니다.202107252021072620210727
  • folder_2각 폴더에는 전송하려는 파일이 포함된 폴더가 있습니다 .
  • 전체 경로의 예:/home/folder_1/20210727/folder_2/*

매일 머신 1에서 머신 2로 전송해야 하기 때문에 스크립트를 cron에 넣고 매일 자동으로 실행하고 싶습니다.

오늘을 염두에 두고 다음과 같이 씁니다.

y=${BASH_REMATCH[1]}
m=${BASH_REMATCH[2]}
d=${BASH_REMATCH[3]}
BASEDATE=`date '+%Y%m%d'`
DATA=$(eval "echo $BASEDATE")

따라서 이라고 말하면 오늘(2021년 7월 27일)에 echo $DATA반환됩니다 .20210727

그러나 다음과 같은 변수를 입력하면:

VAR_1='/home/folder_1/${DATA}/folder_2/*'

작동하지 않습니다. echo $VAR_1돌아올 것이다

/home/folder_1/${DATA}/folder_2/*

내가 원하는 것 대신:

/home/folder_1/20210727/folder_2/*

내 rsync 명령이 다음과 같기 때문에 필요합니다.

rsync -av user@machine_1:${VAR_1} ${VAR_2}

VAR_2새 위치에 대한 경로는 다음 과 같습니다 machine_2.

VAR_2='/home/folder_3/folder_4/'

해당 변수를 사용하여 매일 날짜와 함께 올바른 경로를 반환하는 방법을 모르겠습니다.

어떤 식으로든 도움/조언을 할 수 있나요? 미리 감사드립니다!

답변1

문제는 작은 따옴표 내에서 변수 확장이 비활성화된다는 것입니다. 그래서 당신의 임무는

VAR_1='/home/folder_1/${DATA}/folder_2/*'

로 변경해야합니다

VAR_1="/home/folder_1/${DATA}/folder_2/*"

대신에. 큰따옴표는 전역 문자( )의 확장을 여전히 억제합니다 *. 이는 전역 문자를 인수로 전달하려고 하기 때문에 필요합니다 rsync.

참고 사항:

  • 환경으로 내보내려는 경우가 아니면 쉘 변수 이름에 모두 대문자를 사용하지 않는 것이 좋습니다( PATH예를 들어 실수로 덮어쓰는 것을 상상해 보십시오).
  • 쉘 변수를 사용할 때(귀하의 rsync호출 참조) 권장됩니다큰따옴표분사가 발생하는 것을 원하지 않는 한. 대부분의 경우 파일 이름을 처리할 때 space파일 이름에 문자가 허용되기 때문에 이런 일이 발생하는 것을 원하지 않습니다 .
  • `...`명령 대체를 위해 이전 스타일 기호 와 새 스타일 기호를 혼합하고 있습니다 $( ... ). 이것은존경받는쉽게 중첩할 수 있도록 새로운 스타일을 고수하세요.
  • 왜 필요한지 명확하지 않습니다.
    DATA=$(eval "echo $BASEDATE")
    
    별말씀을요. 단순히 할당하는 것만으로도 충분합니다.
    DATA=$(date +%Y%m%d)
    

관련 정보