사용할 작은 스크립트를 작성 중입니다 rsync
. 변경 가능한 문제에 봉착했습니다.
- 나는 폴더가 있습니다: , 폴더 가
/home/folder_1/
있고 이 폴더는 매일 추가됩니다.20210725
20210726
20210727
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)