이 명령에 문제가 있나요? 구문 오류가 있는 것 같지만 어디에 있는지 모르겠습니다.
sh -c 'mongodump --host mongo_db --gzip --db db $$(if [ $TYPE = "hour" ]; then echo "--archive=/backup/hour/$$(date +"%H").gz"; elif [ $TYPE = "day" ]; then echo --archive=/backup/day/$$(date +"%d").gz; fi)'
TYPE 변수를 기준으로 아카이브 이름을 설정해야 합니다.
- 유형이 "시간"인 경우 출력은 다음과 같아야 합니다.
/backup/hour/10.gz
- 유형이 "day"인 경우 출력은 다음과 같아야 합니다.
/backup/day/1.gz
- 유형이 "월"인 경우 출력은 다음과 같아야 합니다.
/backup/2017-09.gz
답변1
sh -c 'echo mongodump --host mongo_db --gzip --db db --archive="$(
case "$1" in
hour) f="%H";;
day) f="%d";;
month) f="%Y-%m";;
*) f="unknown"; set -- "";;
esac
date "+/backup/$1/$f.gz"
)"' x "$TYPE"
- 마른
case
긴 것보다 더 읽기 쉬움if/elif/elif...
- 이는
x "$TYPE"
참조 게임을 할 필요 없이 "외부" 변수를 sh 본문에 전달하는 방법입니다. sh 본문의 "x"는 $0이 되고 $TYPE은 $1이 됩니다. - 내부적으로 줄바꿈이 허용됨
$(...)
%
형식 문자열 에 비지시문을 배치 할 수 있습니다date
.
답변2
$TIME
따옴표가 없는 변수( )와 구문 오류( ) 가 있습니다 $$(...)
. 또한 TYPE
환경 변수가 아닌 쉘 변수인 경우 해당 값은 작은따옴표로 묶인 스크립트에서 전혀 표시되지 않습니다 sh -c
.
진술은 다음과 같아야합니다
sh -c "mongodump --host mongo_db --gzip --db db \"$(if [ \"$TYPE\" = \"hour\" ]; then echo \"--archive=/backup/hour/$(date +%H).gz\"; elif [ \"$TYPE\" = \"day\" ]; then echo --archive=/backup/day/$(date +%d).gz; fi)\""
(또는 다른 것...)
쉘이 $TYPE
가장 안쪽 하위 쉘에서 확장되고 여전히 큰따옴표로 묶여 있기를 원하기 때문에 올바른 인용은 문제가 됩니다.
필요하지 않은 경우 sh -c
(필요한 것이 아무것도 표시되지 않음) 조금 더 쉬워집니다.
mongodump --host mongo_db --gzip --db db "$(if [ "$TYPE" = "hour" ]; then echo "--archive=/backup/hour/$(date +%H).gz"; elif [ "$TYPE" = "day" ]; then echo "--archive=/backup/day/$(date +%d).gz"; fi)"
그러나 is가 Nor가 $TYPE
아닌 경우 빈 명령 대체를 제공하므로 다음과 같이 수행하는 것이 좋습니다.day
hour
case "$TYPE" in
hour) archive="/backup/hour/$(date +%H).gz" ;;
day) archive="/backup/day/$(date +%d).gz" ;;
*)
printf 'Error: Unknown TYPE "%s"\n' "$TYPE" >&2
exit 1 ;;
esac
sh -c "mongodump --host mongo_db --gzip --db db --archive=$archive"
# or just
mongodump --host mongo_db --gzip --db db --archive="$archive"
이렇게 하면 읽고, 이해하고, 유지 관리하는 것이 더 쉬워집니다.
답변3
설정되지 않았거나, 비어 있거나, 완전히 공백으로 구성된 경우 TYPE
명령문은 if [ = "hour" ]
구문 오류로 귀결됩니다.
를 사용하고 있으므로 sh
일반적인 해결 방법은 접두사를 사용하는 것입니다.if [ "x$TYPE" = "xhour" ]
더 강력한 이중 괄호 구문 ""
( if [ = "hour" ]
예 : sh
. bash
if [[ "$TYPE" = "hour" ]]