if/else 명령의 구문 오류

if/else 명령의 구문 오류

이 명령에 문제가 있나요? 구문 오류가 있는 것 같지만 어디에 있는지 모르겠습니다.

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아닌 경우 빈 명령 대체를 제공하므로 다음과 같이 수행하는 것이 좋습니다.dayhour

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. bashif [[ "$TYPE" = "hour" ]]

관련 정보