Bash: 호출이 없는 함수형 구조? [폐쇄]

Bash: 호출이 없는 함수형 구조? [폐쇄]

나는 Bash 함수와 유사해 보이지만 함수가 아닌 일종의 데이터 구조를 원합니다. ㅏ명명 된명령을 상황에 맞게 구성하고 선행 탭도 허용해야 합니다.

파일에 20개의 Bash 함수가 포함되어 있지만 20줄의 함수 호출이 필요하지 않은 경우에는 괜찮습니다.

비교하다:

헤비히트 기능:

x() {
    echo "x"
}
x

내가 찾고 있는 데이터 구조는 다음과 같습니다.

context {
    echo "x"
}

이러한 데이터 셀에서 명령을 구성하는 방법은 함수를 사용하여 명령을 구성하는 방법과 유사하지만 매개변수 대괄호 ()와 함수 호출이 없습니다.

이 구조물의 이름은 무엇입니까? 당신은 무엇을 하시겠습니까?

노트

  • 구조의 이름은 함수와 마찬가지로 항상 같은 줄에 앞에 와야 합니다.

  • 문서는 여기서 해결책이 아닙니다. 이 경우 구문을 통해 더 간단한 것을 달성하기를 바라고 있습니다.

답변1

그것은 a라고 불린다.복합 명령구문은 다음과 같습니다

{ compound-list; }

(이건 하나야복합 명령, 루프와 같은 다른 명령 for도 복합 명령입니다)

예를 들어:

{
    echo 'hello'
    echo 'world'
}

;마지막 줄 앞에 개행 문자가 없는 경우 에만 필요합니다 }.

{ echo 'hello'; echo 'world'; }

생성자의 명령 { ...; }현재의환경은 함수와 같습니다.

이에 대한 자세한 내용은 다음을 참조하세요.복합 명령에 대한 POSIX 표준 설명.

이러한 부분의 이름을 지정할 이유(또는 가능성)는 없습니다. 왜냐하면 이러한 부분의 이름을 지정하는 것은 쉘 함수를 생성하는 것과 거의 동일하기 때문입니다. 또한 복합 명령의 이름을 지정하는 것은 나중에 복합 명령을 참조할 때만 필요하며, 이는 기능의 목적입니다.

분명히 주석을 사용할 수 있습니다.

# my hello world thing
{
    echo 'hello'; echo 'world'
}

비슷한 방식으로 서브쉘은 다음을 가질 수 있습니다.

(
    echo 'hello'
    echo 'world'
)

이는 현재 쉘의 하위 환경에서 실행되며 변수 등의 변경 사항은아니요현재 쉘에 반영됩니다.

일반적인 구문은 다음과 같습니다.

( compound-list )

;여기서는 이전에는 결승전이 필요 없었습니다 ).


이상하게도 쉘 함수를 (...)대신 사용하여 {...;}로컬 환경에서 코드를 실행할 수 있습니다.

helloworld () (
    echo 'hello'
    echo 'world'
)

shlocal이는 지역 변수( 또는 typeset) 를 지원하지 않고 스크립팅 환경 수정이 필요하지 않은 언어로 함수를 작성하는 경우 bash유용할 수 있습니다 .

답변2

댓글이 충분합니까?

다음과 같이 명령을 재그룹화하고 그룹에 이름을 지정하는 데 사용할 수 있으며 들여쓰기 사용을 금지하는 것은 없습니다.

#context1
    echo "I'm in context1"
#end of context1

#context2
    echo "I'm in context2"
#end of context2

regroup 명령을 사용할 수도 있습니다 {...}. 제가 아는 한 이 경우에는 다른 효과가 없습니다.

#context1
{
    echo "I'm in context1"
}
#end of context1


{ #context2
    echo "I'm in context2"
} #end of context2

이러한 컨텍스트를 로컬 범위와 연결하려는 경우 하위 쉘을 사용할 수 있습니다.

#context1
(
    context="context1"
    echo "I'm in $context"
)
#end of context1

( #context2
    echo "I'm in $context" #context is undefined there
    context=context2
    echo "I'm in $context"
) #end of context2

여기에서 시도해 보세요

관련 정보