이 명령의 구문은 다음 for
과 같습니다.
for name [ [in [words ...] ] ; ] do commands; done
이 명령의 구문은 다음 case
과 같습니다.
case word in [ [(] pattern [| pattern]...) command-list ;;]... esac
이 select
구성은 POSIX에 대한 Bash 확장입니다. 메뉴를 쉽게 생성할 수 있습니다. 구문은 for 명령과 거의 동일합니다.
select name [in words ...]; do commands; done
이 명령의 구문은 다음 {...}
과 같습니다.
{ list; }
질문:
다른 명령에 사용된 구분 기호 대신 명령의 절이
case
구분된 이유는 무엇입니까?;;
;
for
and 명령에서 해당 부분을 무시case
하면in
왜 다음;
합계;;
도 남지 않고 무시되나요?반면에
select
명령어 에서는;
해당 부분이 무시되면 무시되지 않습니다in
.case
in
명령의 다음 부분은 무시되지 않지만 명령for
내에서는 무시됩니다. 임의적으로 일관성이 없는 POSIX 셸 디자인인가요?;
복합 명령에는 어떤 유형의 태그가 사용됩니까 ?;;
명령 목록(복합 명령과 반대)에는
;
제어 연산자가 있습니다.복합 명령 사이에 왜 하나가 있어야 합니까
{ list; }
? 조항으로 간주되면 조항이기도 합니까? 복합 명령의 절은 줄 바꿈으로 구분해야 합니까? 추가 읽기;
list
}
}
{ list
;
내 이전 질문과 Homer의 질문에 답해 주세요., "단어를 구분하기 위해 공백 대신 세미콜론이 필요한 이유는 무엇입니까?"라고 물었습니다. "세미콜론과 공백은 모두 쉘 메타 문자"이기 때문입니다.
노트:
while
, 및 명령의 구문 도 나열하고 싶지만 until
사용법 측면에서는 if
명령과 유사하게 작동한다고 생각합니다.for
;
답변1
;;
;
in 문 작업에 대한 부분에 대답하려면 case
특정 분기가 종료된 경우 Case 문의 단일 분기에서 여러 명령을 실행하는 단일 행 명령을 작성할 수 없다는 점을 고려하십시오.;
여러 줄 명령을 사용하여 이 작업을 수행할 수 있지만 이러한 방식으로 셸 구문을 설계하면필요하다여러 줄, 여러 줄(개행)을 피할 수 없는 쉘 구문의 다른 위치는 없습니다. ;;
셸 디자인에서 케이스 스위치를 사용하면 코드를 작성할 때 더 큰 유연성을 얻을 수 있습니다.
case
for
, 및 와 비교 하여 while
이러한 명령은 모두 각 사용 사례에서 특정 예약어를 따릅니다. ( ,,,,,,, )until
if
list
then
elif
else
fi
do
done
case
반면에 다음과 같은 "패턴"이 있는 목록이 나옵니다.아무것--필요한 패턴은 유효한 명령의 이름일 수도 있습니다.
답변2
가장 기본적인 빌딩 블록은 "간단한 명령"입니다(LESS=+/'simple Commands' man bash).
단순 명령 단순 명령은... 제어 연산자에 의해 종료됩니다.
일반적으로 쉼표(;)는 간단한 명령을 종료하는 제어 연산자입니다.
매뉴얼에서 복사한 대부분의 행에서는 (;)이 종료 제어 문자로 사용됩니다. 예를 들어:
for name [ [in [words ...] ] ; ] do commands; done
in words;
및 둘 다 commands;
로 끝나는 "간단한 명령"일 수 있습니다 ;
. 이 간단한 예에서는:
for w in $(echo "a b c"); do echo $w; done
간단한 명령 echo "a b c"
입니다 . echo $w
결과 목록은 목록의 끝을 감지하기 위해 echo "a b c"
a로 종료됩니다 . 이는 필요하지 않습니다. 효과는 동일합니다.;
for w in $(echo "a b c")
do echo $w
done
for 루프에서 [ [in [words ...] ] ; ]
전체가 선택 사항인 유일한 이유 는 이 경우 요소 목록이 "위치 인수" 목록(다음을 사용하여 설정할 수 있음)이기 때문입니다 set
.
$ set -- *
$ # for name [ [in [words ...] ] ; ] do commands; done
$ for f do echo $f; done
"복합 명령"을 작성하기 위해 "간단한 명령"과 동일한 개념을 적용하는 경우 대부분의 질문이 필요합니다.
- 다른 명령에 사용된 절
;;
대신 case 명령의 절이 구분된 이유는 무엇입니까 ?;
끝을 감지할 수 있도록일부간단한 명령은 간단한 문자로 끝납니다 ;
.
case b in ([a-d]) echo "yes"; cp filea fileb; rm filed; ;; esac
또는 가독성을 위해 다시 작성했습니다.
case b in
([a-d])
echo "yes";
cp filea fileb;
rm filed;
;;
esac
for
and 명령에서 해당 부분을 무시case
하면in
왜 다음;
합계;;
도 남지 않고 무시되나요?
in in case 절의 사용은 선택 사항이 아닙니다.
2.2. 이에 비해
select
명령 에서는;
in 부분이 무시되면 무시되지 않습니다.
명령(ls *)의 출력에서 단어 목록이 제공되면 해당 섹션은 명령에서 사용된 것과 똑같은 방식 [in words ...]
으로 a로 종료됩니다 .;
for
2.3.
case
명령의 다음 부분in
은 무시되지 않지만for
명령에서는 무시됩니다. 임의적으로 일관성이 없는 POSIX 셸 디자인인가요?
아니요, 명령에 대한 불완전한 이해로 인해 발생하는 것 외에는 불일치가 없습니다.
;
복합 명령에는 어떤 유형의 태그가 사용됩니까 ?;;
"제어 연산자"는 하나 이상의 "간단한 명령"을 종료하는 데 사용됩니다.
복합 명령 사이에 왜 하나가 있어야 합니까
{ list; }
?;
list
}
아니요, "필수"는 없습니다. 올바른 목록은 다음과 같습니다.
[ 2 -lt 4 ] &&
{ echo "yes"
echo "it is smaller"
}
"Look, Horse!! (;)"는 아니지만 일종의 메타 문자(개행 문자)를 사용하여 }
독립적으로 만들어야 합니다.
예: [ 2 -lt 4 ] && { echo "yes"; echo "it is smaller"; }
다르게 보입니다.
그러나 그것은 똑같은 명령입니다.
절에 관한 부분(자체 세부정보 목록이 있는 새 단어)을 무시합니다.
세어보지는 않았지만 time
빌트인, 단어, 토큰 등에 대한 질문이 10개가 넘었습니다. 여기서도 비슷한 문제가 발생합니까?
"간단한 명령"이 무엇인지, 아닌지 마침내 아셨나요?
그런 다음 "복합 명령"을 고려하고 (진지하게 생각한 후) 몇 가지 다른 질문을 고려할 수 있습니다.