예기치 않은 토큰`fi` 근처의 구문 오류 “$NAME”에 이름을 표시하는을 추가하여 내 문제가 내

나는 반드시 대답을 원하지는 않지만 누군가가 나에게 몇 가지 문학이나 예를 지적 할 수 있다면. 알아 내고 싶습니다.

스크립트를 실행할 때 오류가 발생합니다.

예기치 않은 토큰 근처의 구문 오류 fi

ifif의견을 작성하고 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입니다.

당신은 누락 ;

에 대한 구문 listman test


답변