다음 스크립트에서 구문 오류가 발생합니다 unexpected token fi
.Permission denied
cd /home/NorthStar/Dhruva/server-specific-scripts/crons/ResetETA
su postgres -c "psql -d "Dhruva" -f /home/NorthStar/Dhruva/server-specific-scripts/crons/db-connection/query.sql" >> reset.log 2> reset.log
if su postgres -c "psql -d "Dhruva" -f /home/NorthStar/Dhruva/server-specific-scripts/crons/db-connection/query.sql; then
printf su postgres -c "psql -d "Dhruva" -f /home/NorthStar/Dhruva/server-specific-scripts/crons/db-connection/query.sql\n' >> resset.log
else
printf su postgres -c "psql -d "Dhruva" -f /home/NorthStar/Dhruva/server-specific-scripts/crons/db-connection/query.sql\n' >> reset_error.log
fi
답변1
불균형한 인용문
당신이 보고 있는 것은 균형이 맞지 않는 인용문의 혼란스러운 예입니다.
작은따옴표와 큰따옴표의 모든 쌍은 균형을 이루어야 합니다. 즉, 시작 따옴표가 있을 때마다 나중에 동일한 문에 닫는 따옴표가 있어야 합니다.그리고올바르게 중첩되어야 합니다. (예를 들어 echo "foo 'bar' baz"
작동하지만 echo "foo 'bar baz"'
작동하지 않습니다.
따라서 귀하의 경우 sh
(또는 귀하가 사용하는 Bourne 쉘이 무엇이든) 따옴표를 해석하십시오.마치균형이 잡혀 있어 스크립트의 일부가 원하지 않는 부분, 즉 대부분의 구성 부분이 "인용"됩니다 if .. else .. fi
.
스크립트의 또 다른 (축약된) 예: su "psql -d "Dhruva" blah.sql"
이 예에서 문자열은 Dhruva
실제로 입니다 .외부인용문, 이것은 아마도 당신이 원하는 것이 아닐 것입니다.
본질적으로 문제는 따옴표의 균형이 맞지 않는다는 것입니다. 나는 당신의 스크립트를 더 분석하여 당신이 원하는 것이 무엇인지 알 수 없는지 확인하고 수정된 버전을 제안할 것이지만, 스크립트에 대한 당신의 의도를 잘 이해하지 못한다는 것을 인정합니다.
"고정" 스크립트
나는 "고정"을 넣었다위협적인 인용문왜냐하면 스크립트 구문을 수정하는 방법을 알려줄 수 있다고 해도 여전히 몇 가지 우려 사항이 있기 때문입니다. 이에 대해서는 이 답변 끝에 나열하겠습니다.
일부 리팩토링 및 인용문 수정
첫째, 쉽게 리팩토링할 수 있는 반복되는 요소가 포함된 매우 긴 줄이 있으므로 이미 "수정" 작업이 더 쉬워졌습니다.
#!/bin/sh
cd /home/NorthStar/Dhruva/server-specific-scripts/crons/ResetETA
db="Dhruva"
file="/home/NorthStar/Dhruva/server-specific-scripts/crons/db-connection/query.sql"
cmd="psql -d $db -f $file"
su postgres -c "$cmd" >> reset.log 2> reset.log
if su postgres -c "$cmd"; then
printf su postgres -c "$cmd" >> resset.log
else
printf su postgres -c "$cmd" >> reset_error.log
fi
위 구문은 현재 유효하지만 여전히 몇 가지 질문이 있습니다.
$cmd
그렇게 여러 번 달릴 필요가 있나요 ? 출력이 변경됩니까(예: 쿼리에 부작용이 있습니까?) 아니면 결과를 저장하고 로그 파일에 별도로 추가할 수 있습니까?- 오타 입니까
resset.log
, 아니면 실제로 세 개의 다른 로그가 있습니까? printf ...
여기서는 (아마도) 하고 싶은 일을 하고 있지 않습니다.printf
첫 번째 매개변수는 형식 문자열(이 경우"su"
)이므로 을 인쇄합니다su
.