if 조건의 괄호: 공백 없이 구문 오류가 발생하는 이유는 무엇입니까?

if 조건의 괄호: 공백 없이 구문 오류가 발생하는 이유는 무엇입니까?

일년 중 처음 이틀에 스크립트가 실행될 때 아래 스크립트를 사용하여 이틀 뒤로 이동하고 매월 첫째 날과 둘째 날을 확인하여 이틀 뒤로 이동합니다.

if [$month="01"] && [$day="01"]; then
        date="$last_month/$yes_day/$last_year"
        fulldate="$last_month/$yes_day/$last_year"
else
        if [$month="01"] && [$day="02"]; then
                date="$last_month/$yes_day/$last_year"
                fulldate="$last_month/$yes_day/$last_year"
        else
                if [ $day = "01" ]; then
                        date="$last_month/$yes_day/$year"
                        fulldate="$year$last_month$yes_day"
                else
                        if [ $day = "02" ]; then
                                date="$last_month/$yes_day/$year"
                                fulldate="$year$last_month$yes_day"
                        else
                                date="$month/$yes_day/$year"
                                fulldate="$year$month$yes_day"
                        fi
                fi
        fi
fi

하지만 내 문제는 다음과 같은 오류 메시지가 나타납니다

Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found

답변1

[은(는) 메타 문자도 아니고 제어 연산자도 아닙니다(예약어도 아님, 와 동일 ]). 따라서 주위에 공백이 필요합니다. 그렇지 않으면 쉘은 별도의 인수 , 및 가 있는 명령 대신 명령을 "인식"합니다 [01=01]. 각 연산자와 피연산자는 명령에 대한 별도의 인수여야 하므로 연산자 주위에도 공백이 필요합니다.[01=01][

if [ "$month" = "01" ]

[$month="01"]$month또는 의 모든 문자와 일치하는 와일드카드 패턴입니다 "01. 아무것도 일치하지 않으면 그대로 두십시오.

닫는 괄호 뒤에 세미콜론이 있으면 세미콜론은 항상 별도 토큰의 일부이므로 앞에 공백이 필요하지 않습니다.

if [ "$month" = "01" ]; then

bash(및 ksh 및 zsh)의 이중 괄호 구문에도 동일하게 적용됩니다.

여러 조건

조건을 결합하는 방법에는 두 가지가 있습니다.

  1. 이내에[

  2. 별도의 명령과 [결합 &&하거나||

괄호로 그룹화하는 것이 더 쉬울 수 있습니다 [.

if [ "$month" = "01" -a "$day" = "01" ] # -a for and, -o for or

if [ "$month" = "01" ] && [ "$day" = "01" ]

첫 번째는 신뢰할 수 없으므로 피해야 합니다(예: 를 사용하려는 경우 month='!'). 안전한 문자열을 먼저 사용하면(가능한 경우) 이상한 변수 내용으로 인한 문제를 방지하거나 [[/ ]]대신 [/를 사용합니다 ].

if [ "01" = "$month" -a "01" = "$day" ]

답변2

그것을 작성하는 또 다른 방법:

case $month:$day in
  (01:0[12])
    date="$last_month/$yes_day/$last_year"
    fulldate="$last_month/$yes_day/$last_year"
    ;;
  (*:0[12])
    date="$last_month/$yes_day/$year"
    fulldate="$year$last_month$yes_day"
    ;;
  (*)
    date="$month/$yes_day/$year"
    fulldate="$year$month$yes_day"
esac

관련 정보