나는 반드시 대답을 원하지는 않지만 누군가가 나에게 몇 가지 문학이나 예를 지적 할 수 있다면. 알아 내고 싶습니다.
스크립트를 실행할 때 오류가 발생합니다.
예기치 않은 토큰 근처의 구문 오류
fi
if
내 if
의견을 작성하고 echo "$NAME"
에 이름을 표시하는을 추가하여 내 문제가 내 진술에 있다고 추론했습니다 /etc/
.
변경, #
from if
및 remove를 fi
추가 #
하면 wc -c "$NAME"
위에 나열된 구문 오류가 발생합니다. 그때 ;
사이에 추가했습니다 ]
. 나는 또한 then
해결책없이 다음 줄로 옮겼 습니다.
#!/bin/bash
for NAME in /etc/*
do
if [ -r "$NAME" -af "$NAME" ] then
wc -c "$NAME"
fi
done
답변
키워드와 같은 if
, then
, else
, fi
, for
, case
등 필요에 쉘이 명령 이름을 예상하는 장소에 있습니다. 그렇지 않으면 평범한 단어로 취급됩니다. 예를 들어
echo if
그냥 인쇄 if
하고 조건부 명령을 시작하지 않습니다.
따라서 라인에서
if [ -r "$NAME" -af "$NAME" ] then
단어 then
는 명령의 인수입니다 (명령 [
이 실행되어야하는지 불평 할 것임). 쉘은 계속을 찾고 명령 위치에서 then
찾습니다 fi
. 거기 때문에 if
아직을 찾고 그 then
의는 fi
예기치 않은, 구문 오류가 있습니다.
then
키워드로 인식되도록 명령 종결자를 먼저 배치해야합니다. 가장 일반적인 명령 종결자는 줄 바꿈이지만 이전 then
에는 세미콜론 (줄 바꿈과 정확히 동일한 의미)을 사용하는 것이 일반적입니다.
if [ -r "$NAME" -af "$NAME" ]; then
또는
if [ -r "$NAME" -af "$NAME" ]
then
이 문제를 해결하면 명령에서 [
이해할 수 없기 때문에 다른 오류가 발생합니다 -af
. 당신은 아마 의미
if [ -r "$NAME" -a -f "$NAME" ]; then
테스트 명령은 옵션처럼 보이지만 이와 같이 묶을 수는 없습니다. 그들은 [
명령의 운영자이며 각각 [
과 같이 별도의 단어가 필요합니다 ]
.
그건 그렇고, [ -r "$NAME" -a -f "$NAME" ]
작동 하지만 , 나는 쓰기를 권장합니다
[ -r "$NAME" ] && [ -f "$NAME" ]
또는
[[ -r $NAME && -f $NAME ]]
명령이 연산자를 피연산자와 쉽게 구별 할 수 없으므로 [ … ]
조건을 단순하게 유지하는 것이 가장 좋습니다 [
. 경우 $NAME
외모 운영자가 유효한 위치에있는 연산자와 나타납니다처럼, 그것은 연산자로 해석 할 수있다. 이것은이 답변에서 볼 수있는 간단한 경우에는 발생하지 않지만 더 복잡한 경우는 위험 할 수 있습니다. [
쉘의 논리 연산자 를 별도로 호출하여 사용하면이 문제를 피할 수 있습니다.
두 번째 구문은 [[ … ]]
bash (및 ksh 및 zsh는 있지만 일반 sh는 아님)에 존재 하는 조건부 구문을 사용합니다 . 이 구조는 특수 구문, 반면되고 [
따라서 당신은 같은 것을 사용할 수 있으며, 다른 명령과 같은 구문 분석 &&
내부와 일부 문자열 사업자의 인수를 제외하고 인용 변수에 필요하지 않습니다 ( =
, ==
, !=
, =~
) (참조 이중 인용 필요한 경우 ? 자세한 내용은).
답변
다음과 같이 변경된 내용을 확인하십시오.
만약 [-r "$ NAME" -a -f "$ NAME"] ; 그때 # ^^^^^ ^ 화장실 -c "$ NAME" fi
if 블록에서 모든 명령을 제거하려면 최소한 다음과 같이 콜론을 추가해야합니다.
if [ -r "$NAME" -a -f "$NAME" ]; then
:
fi
또는 한 줄 버전
if [ -r "$NAME" -a -f "$NAME" ]; then :; fi
답변
다른 사람들은 이미 지적했지만 공식 참조를 찾고 있다면 RTM
목록이라면; 그런 다음 목록; [elif 목록; 그런 다음 목록; ] … [else list;] fi
if 목록이 실행됩니다. 종료 상태가 0이면 다음 목록이 실행됩니다. 그렇지 않으면 각 elif 목록이 차례로 실행되고 종료 상태가 0이면 해당 thenlist가 실행되고 명령이 완료됩니다. 그렇지 않으면 else 목록이있는 경우 실행됩니다. 종료 상태는 마지막으로 실행 된 명령의 종료 상태이거나, 테스트 된 조건이 없으면 0입니다.
당신은 누락 ;
에 대한 구문 list
은man test