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
)을 참조하세요.