bash가 올바른 괄호를 찾을 수 없습니까?

bash가 올바른 괄호를 찾을 수 없습니까?

Synology 상자에 MariaDB 인스턴스를 구축하기 위해 bash 스크립트를 작성 중입니다. 실행하면 작동하지만 오류가 발생합니다.

admin@synology:/volume1/@appstore/MariaDB10/usr/local/bip$ ./mysql_backup
./mysql_backup: line 7: [: missing `]'

admin@synology:/volume1/@appstore/MariaDB10/usr/local/bip$ head -10 mysql_backup
#!/bin/bash

DBBACKUP=/volume1/remotebackup/mnt/devmysql.sql.gz
ERRFILE=/volume1/remotebackup/mnt/devmysqlerr.log


if [ -f "${DBBACKUP}.prev" && ! -f "${ERRFILE}" ] ; then
        rm -f "${DBBACKUP}.prev"
        mv "${DBBACKUP}" "${DBBACKUP}.prev"
fi

공백과 두 번째 종결자 "]"를 추가하면아직같은 오류가 발생합니다. 중첩된 "if" 문이 해결책을 제공했지만, 짜증나게도 일부 작업이 예상대로 작동하지 않았습니다.

답변1

두 표준 테스트의 구문은 다음 &&과 같습니다.

[ expression_1 ] && [ expression_2 ]

또는 다음을 사용하십시오.오래된 -a옵션(이러지 마세요),

[ expression_1 -a expression_2 ]

귀하의 경우를 예로 들면,

if [   -f "$DBBACKUP.prev" ] &&
   [ ! -f "$ERRFILE"       ]
then
    mv "$DBBACKUP" "$DBBACKUP.prev"
fi

의 경우 이전과 같이 사용할 bash수 있지만 &&비표준 [[ ... ]]테스트에만 사용할 수 있습니다.

[[ expression_1 && expression_2 ]]

다음과 같이 쓸 수도 있습니다.

[[ expression_1 ]] && [[ expression_2 ]]

특수를 제외하고는 쉘 연산자입니다 [[ ... ]].&&두 개의 명령을 분리하십시오., 두 번째는 첫 번째가 성공한 경우에만 실행됩니다. 따라서 다음 명령이 주어집니다.

[ expression_1 && expression_2 ]

쉘이 먼저 실행 [ expression_1되고 후행 쉘이 누락되어 ]오류가 발생합니다.

또한보십시오:

  • POSIX 사양 test[.
  • man test및/또는 man [매뉴얼 제공외부 test그리고 [명령. 대부분의 셸에는 이러한 명령이 내장되어 있지만 일부 특정 테스트 연산자는 다를 수 있지만 의미는 동일해야 합니다(비표준 연산자가 구현될 수 있음).
  • help [, help test및 쉘 help [[에는 bash쉘에 내장된 명령에 대한 간략한 설명이 표시됩니다 bash. bash쉘 내장 함수 에 대한 자세한 내용은 bash매뉴얼( man bash)을 참조하세요.

관련 정보