Bash는 어떤 상황에서 단어 분리 및 와일드카드를 수행하지 않습니까?

Bash는 어떤 상황에서 단어 분리 및 와일드카드를 수행하지 않습니까?

이러한 경우 Bash는 와일드카드에 대해 토큰화를 수행하지 않습니다.

  • 할당된 LHS 또는 RHS(인덱스 배열 제외)
    var=$value                                # simple variable
    declare -A hash
    key="key with a space"
    hash[$key]=$value                         # index of an associative array
    
    arr=$(echo "1 2 3")                       # word splitting does happen here
    
  • ~에[[ ]]
    var="one two"
    if [[ $var = *" "* ]]; then ...           # check if var has a space in it
    if [[ $(echo "one two") = $var ]]; then   # use the output of command substitution to compare with var
    
  • ~에(( ))
    ((sum = $(echo "99 + 1")))                  # assigns 100 to sum
    
  • 이 문자열에서
    cat <<< *                                 # gives '*' as the output
    

Bash가 단어 분리 및 와일드카드를 수행하거나 수행하지 않는 상황에 대한 명시적인 목록이 있습니까?

답변1

이는 일반적으로 의미가 없거나 의미가 없는 경우이므로 목록이 아닌 컨텍스트입니다. 그러나 목록이 아닌 컨텍스트에서는 이를 수행하지만 여러 항목이 생성되거나 항목을 공백으로 연결하면 불평합니다.

또한 와일드카드 패턴 일치와 파일 이름 생성 또는 와일드카드(패턴과 일치하는 파일 이름 목록 생성)를 구별하는 것이 중요합니다.

예를 들어 에서는 현재 디렉터리에 숨겨져 있지 않은 파일 목록으로 확장되지 않지만 여전히 패턴으로 해석되므로 [[ foo = * ]]와일드카드가 없습니다 (여기서는 패턴 일치 에 대해 true를 반환함 ).**foo*

여기서 분할은 따옴표가 없는 인수 확장( $param), 명령 대체( $(...)`...`) 및 산술 확장( $((...))및 ) $[...]에서 수행되는 암시적 분할을 의미하며, $IFS다음의 특수 인수를 사용합니다.목록 컨텍스트.

*아래에서 이 예를 들어보겠습니다. 패턴으로서 모든 문자 시퀀스와 일치합니다. glob으로서 현재 디렉토리에서 숨겨지지 않은 모든 파일(의 영향을 받음 dotglob, ...)로 확장됩니다 GLOBIGNORE.

다음은 bash다른 쉘에도 적용되며 변경 사항이 있습니다.

분할 및 와일드카드가 발생하지 않습니다.

  • 인용할 때는 '*', "*", \*, $'*', $"*"를 사용하세요.

  • 여기 문서에서(구분 기호 인용 여부에 관계없이):

    cat << EOF
    *
    EOF
    cat << 'EOF'
    *
    EOF
    
  • 산술 표현식 내부:

    • echo $((2 * 2))( *와일드카드는 아니지만 $((...))분할+glob을 통해 나중에 시도해 보세요 IFS=4)
    • array[2 * 2]=4// ${array[2 * 2]}. ( 는 와일드카드임) 에는 따옴표 exec {array[2*2]}>&1가 필요합니다.unset -v 'a[1]'[1]
    • ((2 * 2))
    • echo $[2 * 2]
  • 스칼라 변수 할당:

    • var=*
    • array[x]=*
    • hash[key]=*
    • array=([1]=*)(이전 버전에서는 와일드카드를 사용했지만 bash예를 들어 현재 디렉터리에서 파일을 호출할 때는 다른 작업을 수행했습니다.)1=foo
    • var+=*
  • 연관 배열 키에서:

    • typeset -A hash; hash[**]=value; v=${hash[**]}. 매우 특별 *하지만 .@
  • //할당 후 export//특정 경우에만: 할당 키워드와 변수 이름은 부분적으로나 확장의 결과로 인용할 수 없습니다. 할당 및 리디렉션은 이전에 발생할 수 있지만 다음에서는 발생하지 않습니다.localtypesetdeclarereadonly=command

    • 확인(split+glob 제외):
      • export a=*
      • x=1 < /dev/null export foo a=*
    • 비정상(split+glob 실행):
      • ""export a=*
      • command export a=*(POSIX 모드 제외)
      • export "a"=*
      • export a\=*
      • "$(echo export)" a=*

    자세한 내용은 다음을 방문하세요.지역 변수 할당에는 따옴표가 필요합니까?

  • case * in (...); esac

  • case x in (*); esac(split+glob은 없지만 *패턴으로 처리되며 인용되지 않은 확장에 있는 와일드카드에도 적용됩니다. 예: var=*; case x in ($var))

  • 안에 [[...]]. 단, , , 연산자 오른쪽에 따옴표가 없는 와일드카드 문자가 있으면 패턴 일치가 수행 =됩니다 .==!=

  • 버전 4.4부터 여기에 문자열이 있습니다. 이전 버전에서는 분할이 수행되었으며(와일드카드는 아니지만) 결과 단어가 공백으로 연결되었습니다.

  • 쉘이 POSIX 모드이고 비대화형인 경우 리디렉션된 대상에서: bash -o posix -c 'echo test > *'그렇지 않으면 분할+glob이 수행되고 bash1개보다 적거나 많은 요소의 목록으로 확장하면 오류가 보고됩니다.

관련 정보