예기치 않은 태그 'fi' 근처에 구문 오류가 있습니다.

예기치 않은 태그 'fi' 근처에 구문 오류가 있습니다.

나는 반드시 대답을 원하는 것은 아니지만 누군가 나에게 몇 가지 문헌이나 예를 알려줄 수 있다면 좋겠습니다. 나는 알고 싶다.

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

예상치 못한 태그 근처의 구문 오류fi

나는 if내 진술 if에 주석을 달고 echo "$NAME"display 를 추가함으로써 이를 수행했습니다 /etc/.

변경 작업을 수행하고 #에서 제거 if하고 fi추가 #하면 wc -c "$NAME"위에 나열된 구문 오류가 발생합니다. ;사이에 추가 했어요 ]. then다음 줄로 이동했지만 해결 방법이 없습니다.

#!/bin/bash
for NAME in /etc/*
do

     if [ -r "$NAME" -af "$NAME" ] then
          wc -c "$NAME"
     fi
done

답변1

ifthen, , else, fi등과 같은 for키워드는 case쉘에서 명령 이름이 필요한 위치에 배치되어야 합니다. 그렇지 않으면 일반 단어로 처리됩니다. 예를 들어,

echo if

그냥 인쇄하면 if조건부 지시문이 시작되지 않습니다.

그래서 줄에

if [ -r "$NAME" -af "$NAME" ] then

이 단어는 then명령에 대한 인수입니다 [(실행되면 이에 대해 불평합니다). 쉘은 검색을 계속하고 명령 위치를 then찾습니다 . 아직 찾고 있는 이 fi있으므로 예상치 못한 일 이며 구문 오류가 있습니다.ifthenfi

then키워드로 인식되도록 명령어 종결자를 앞에 넣어야 합니다 . 가장 일반적인 명령 종결자는 개행 문자이지만 그 이전에는 then일반적으로 세미콜론(개행 문자와 동일한 의미를 가짐)이 사용되었습니다.

if [ -r "$NAME" -af "$NAME" ]; then

또는

if [ -r "$NAME" -af "$NAME" ]
then

[일단 문제를 해결하면 명령이 명령 을 이해하지 못하기 때문에 또 다른 오류가 발생하게 됩니다 -af. 아마도 당신은 의미

if [ -r "$NAME" -a -f "$NAME" ]; then

테스트 명령은 옵션처럼 보이지만 이렇게 묶을 수는 없습니다. 이들은 [명령의 연산자이며 각각은 별도의 단어여야 합니다(예: do []).

그건 그렇고, [ -r "$NAME" -a -f "$NAME" ]가능하다면 글을 쓰는 것이 좋습니다

[ -r "$NAME" ] && [ -f "$NAME" ]

또는

[[ -r $NAME && -f $NAME ]]

이 명령은 연산자와 피연산자를 쉽게 구분할 수 없으므로 [ … ]조건을 단순하게 유지하는 것이 가장 좋습니다 . 연산자처럼 보이고 해당 연산자가 유효한 위치에 발생하면 [연산자 로 구문 분석될 수 있습니다. $NAME이 답변에 표시된 간단한 경우에는 이런 일이 발생하지 않지만 더 복잡한 경우에는 위험할 수 있습니다. 이 문제는 이 코드를 별도로 작성 [하고 셸의 논리 연산자를 사용하여 피할 수 있습니다.

두 번째 구문은 [[ … ]]bash(및 ksh 및 zsh, 일반 sh는 아님)에 있는 조건부 구성을 사용합니다. 이 구조는 구문적으로 특별하고 [다른 명령처럼 구문 분석되므로 내부와 같은 것을 사용할 수 있으며 특정 문자열 연산자( , , , ) &&에 대한 인수를 제외하고 변수를 인용할 필요가 없습니다 .===!==~언제 큰따옴표가 필요합니까?더 알아보기).

답변2

다음과 같이 어떤 변화가 있는지 확인하세요

if [ -r "$NAME"-a -f"$NAME"];그 다음에
#^^^^^^
     화장실 -c "$NAME"
필리핀 제도

if 블록의 모든 명령을 제거하려면 최소한 콜론을 추가해야 합니다.

if [ -r "$NAME" -a -f "$NAME" ]; then
    :
fi

또는 한 줄 버전

if [ -r "$NAME" -a -f "$NAME" ]; then :; fi

답변3

다른 사람들이 지적했지만 공식적인 참고 자료를 찾고 있다면RTM

if 목록; 다음 목록; ... [다른 목록;] fi

목록이 실행되면. 종료 상태가 0이면 then 목록이 실행됩니다. 그렇지 않으면 각 elif 목록이 차례로 실행되고 종료 상태가 0이면 해당 thenlist가 실행되고 명령이 완료됩니다. 그렇지 않으면 else 목록이 있으면 실행됩니다. 종료 상태는 마지막으로 실행된 명령의 상태이거나, true로 테스트되는 조건이 없으면 0입니다.

당신은 그것을 놓쳤어요;

구문은 다음과 같습니다list에 설명된man test

관련 정보