나는 반드시 대답을 원하는 것은 아니지만 누군가 나에게 몇 가지 문헌이나 예를 알려줄 수 있다면 좋겠습니다. 나는 알고 싶다.
스크립트를 실행하면 오류가 발생합니다.
예상치 못한 태그 근처의 구문 오류
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
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
테스트 명령은 옵션처럼 보이지만 이렇게 묶을 수는 없습니다. 이들은 [
명령의 연산자이며 각각은 별도의 단어여야 합니다(예: 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