복합 명령에 ";" 사용 [닫기]

복합 명령에 ";" 사용 [닫기]

이 명령의 구문은 다음 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; }

질문:

  1. 다른 명령에 사용된 구분 기호 대신 명령의 절이 case구분된 이유는 무엇입니까?;;;

  2. forand 명령에서 해당 부분을 무시 case하면 in왜 다음 ;합계 ;;도 남지 않고 무시되나요?

    반면에 select명령어 에서는 ;해당 부분이 무시되면 무시되지 않습니다 in.

    casein명령의 다음 부분은 무시되지 않지만 명령 for내에서는 무시됩니다. 임의적으로 일관성이 없는 POSIX 셸 디자인인가요?

  3. ;복합 명령에는 어떤 유형의 태그가 사용됩니까 ?;;

    명령 목록(복합 명령과 반대)에는 ;제어 연산자가 있습니다.

  4. 복합 명령 사이에 왜 하나가 있어야 합니까 { list; }? 조항으로 간주되면 조항이기도 합니까? 복합 명령의 절은 줄 바꿈으로 구분해야 합니까? 추가 읽기;list}}{ list;내 이전 질문과 Homer의 질문에 답해 주세요., "단어를 구분하기 위해 공백 대신 세미콜론이 필요한 이유는 무엇입니까?"라고 물었습니다. "세미콜론과 공백은 모두 쉘 메타 문자"이기 때문입니다.

노트:

while, 및 명령의 구문 도 나열하고 싶지만 until사용법 측면에서는 if명령과 유사하게 작동한다고 생각합니다.for;

답변1

;;;in 문 작업에 대한 부분에 대답하려면 case특정 분기가 종료된 경우 Case 문의 단일 분기에서 여러 명령을 실행하는 단일 행 명령을 작성할 수 없다는 점을 고려하십시오.;

여러 줄 명령을 사용하여 이 작업을 수행할 수 있지만 이러한 방식으로 셸 구문을 설계하면필요하다여러 줄, 여러 줄(개행)을 피할 수 없는 쉘 구문의 다른 위치는 없습니다. ;;셸 디자인에서 케이스 스위치를 사용하면 코드를 작성할 때 더 큰 유연성을 얻을 수 있습니다.


casefor, 및 와 비교 하여 while이러한 명령은 모두 각 사용 사례에서 특정 예약어를 따릅니다. ( ,,,,,,, )​​​​untiliflistthenelifelsefidodone

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

"복합 명령"을 작성하기 위해 "간단한 명령"과 동일한 개념을 적용하는 경우 대부분의 질문이 필요합니다.

  1. 다른 명령에 사용된 절 ;;대신 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
  1. forand 명령에서 해당 부분을 무시 case하면 in왜 다음 ;합계 ;;도 남지 않고 무시되나요?

in in case 절의 사용은 선택 사항이 아닙니다.

2.2. 이에 비해 select명령 에서는 ;in 부분이 무시되면 무시되지 않습니다.

명령(ls *)의 출력에서 ​​단어 목록이 제공되면 해당 섹션은 명령에서 사용된 것과 똑같은 방식 [in words ...]으로 a로 종료됩니다 .;for

2.3. case명령의 다음 부분 in은 무시되지 않지만 for명령에서는 무시됩니다. 임의적으로 일관성이 없는 POSIX 셸 디자인인가요?

아니요, 명령에 대한 불완전한 이해로 인해 발생하는 것 외에는 불일치가 없습니다.

  1. ;복합 명령에는 어떤 유형의 태그가 사용됩니까 ?;;

"제어 연산자"는 하나 이상의 "간단한 명령"을 종료하는 데 사용됩니다.

복합 명령 사이에 왜 하나가 있어야 합니까 { list; }?;list}

아니요, "필수"는 없습니다. 올바른 목록은 다음과 같습니다.

[ 2 -lt 4 ] &&
{ echo "yes"
  echo "it is smaller"
}

"Look, Horse!! (;)"는 아니지만 일종의 메타 문자(개행 문자)를 사용하여 }독립적으로 만들어야 합니다.

예: [ 2 -lt 4 ] && { echo "yes"; echo "it is smaller"; }다르게 보입니다.
그러나 그것은 똑같은 명령입니다.

절에 관한 부분(자체 세부정보 목록이 있는 새 단어)을 무시합니다.
세어보지는 않았지만 time빌트인, 단어, 토큰 등에 대한 질문이 10개가 넘었습니다. 여기서도 비슷한 문제가 발생합니까?

"간단한 명령"이 무엇인지, 아닌지 마침내 아셨나요?
그런 다음 "복합 명령"을 고려하고 (진지하게 생각한 후) 몇 가지 다른 질문을 고려할 수 있습니다.

관련 정보