지역 변수 할당에는 따옴표가 필요합니까?

지역 변수 할당에는 따옴표가 필요합니까?

로컬 작업의 오른쪽에 있는 따옴표를 안전하게 생략할 수 있습니까?

function foo {
    local myvar=${bar}
    stuff()
}

나는 주로 관심이 있지만 bash다른 쉘의 코너 케이스에 대한 정보는 환영합니다.

답변1

export foo="$var"또는 local foo="$var"(또는 readonly, typesetdeclare기타 변수 선언에는 따옴표가 필요함)주문하다) 존재하다:

  • dash버전 0.3.8-15 ~ 0.5.10.2(참조변화).
  • NetBSD sh(또한 Almquist 쉘 기반).
  • shFreeBSD 9.2 또는 이전 버전(참조9.3의 변경 사항)
  • yash
  • zsh5.1 이전 버전에는 에뮬레이션이 포함되어 있었습니다 ksh( sh또는 단어 분리를 수행 export var="$(cmd)"할 위치 zsh(와일드카드 아님)).

그렇지 않으면 변수 확장은 다른 명령에 대한 인수와 마찬가지로 토큰화 및/또는 파일 이름 생성의 영향을 받습니다.

다음과 같은 경우에는 필요하지 않습니다.

  • bash
  • ksh(모든 구현)
  • FreeBSD sh9.3 이상
  • ash 기반의 busybox' sh(2005년부터)
  • zsh
  • dash0.5.11 이상.

에서는 in 또는 에뮬레이션을 zsh제외하고 인수 확장 시 분할+glob이 수행되지 않지만 명령 대체 시 분할(glob 아님)이 수행됩니다. 버전 5.1부터 / 및 기타 선언 명령이 이중으로 변경되었습니다.shkshexportlocal핵심 단어/내장위의 다른 셸의 명령과 마찬가지로 이는 sh/ ksh에뮬레이션 내에서도 명령 대체의 경우에도 인용이 필요하지 않음을 의미합니다.

일부 특수한 경우에는 이러한 셸에서도 인용이 필요합니다. 예를 들면 다음과 같습니다.

a="b=some value"
export "$a"

=또는 더 일반적으로 (included)의 나머지 부분이 =인용되거나 일부 확장의 결과인 경우(예: export 'foo'="$var", export foo\="$var"또는 export foo$((n+=1))="$var"( $((...))실제로도 인용되어야 함)...). 즉, exportno 에 있는 경우입니다 export.

export/ local명령 이름 자체가 따옴표로 묶인 경우 ( "export" a="$b", 'ex'port a="$b", \export a="$b", 심지어 와 같은 부분도) AT&T 및 최신 버전의 를 제외하고 ""export a="$b"는 따옴표가 필요합니다 .$bkshmkshdash

export/또는 그 일부가 일부 확장(예: in 또는 Even 또는 유사한)의 결과인 경우 local따옴표가 필요하지만 최신 버전의 .cmd=export; "$cmd" a="$b"export$(:) a="$b"dryrun=; $dryrun export a="$b"dash

어떤 경우에는 > /dev/null export a="$b"일부 pdksh파생상품에 대한 견적이 필요합니다.

, Except , , 가장 최근 및 ( Except 이외의 셸에서 특정 확장 결과에도 동일한 경고가 적용됨)에 command export a="$b"대한 모든 셸에는 따옴표가 필요합니다 .mkshksh93dashbash -o posixcommandexportdash

작성되면 어떤 쉘에서도 필요하지 않습니다.

foo=$var export foo

(이 구문은 Bourne 쉘과도 호환되지만 최신 버전에서는 / 에뮬레이션 zsh에서만 작동합니다 .)shksh

( var=value local var다른 쉘은 다르게 동작하므로 이것을 사용해서는 안됩니다).

export또한 할당과 함께 사용하면 cmdin의 종료 상태가 export var="$(cmd)"손실된다는 의미이기도 합니다. 이렇게 하면 export var; var=$(cmd)이 문제가 발생하지 않습니다.

또한 다음 특별한 경우에 유의하십시오 bash.

$ bash -c 'IFS=; export a="$*"; echo "$a"' bash a b
ab
$ bash -c 'IFS=; export a=$*; echo "$a"' bash a b
a b

내 조언은 항상 인용하라는 것입니다.

답변2

나는 일반적으로 공백과 같은 문자가 존재할 수 있는 변수의 사용법을 인용합니다. 그렇지 않으면 다음과 같은 문제가 발생합니다.

#!/bin/bash

bar="hi bye"

function foo {
  local myvar=${bar}
  printf "%s\n" $myvar
  printf "%s\n" "$myvar"
}

foo

할당에서 변수를 사용하려면 따옴표가 필요하지 않은 것 같지만, 에서와 같이 변수를 사용하려면 printf거기에 따옴표를 붙여야 합니다.

  printf "%s\n" "$myvar"

노트:변수에 따라 $IFS구분 기호의 내용이 결정된다는 점을 기억하세요.

IFS    The  Internal  Field  Separator that is used for word splitting after 
       expansion and to split lines into words with the read builtin command. 
       The default value is ``<space><tab><newline>''.

Bash에서 디버깅을 활성화하면 뒤에서 무슨 일이 일어나고 있는지 확인할 수 있습니다.

$ bash -x cmd.bash 
+ bar='hi bye'
+ foo
+ local 'myvar=hi bye'
+ printf '%s\n' hi bye
hi
bye
+ printf '%s\n' 'hi bye'
hi bye

위에서 우리는 변수가 $bar잘 전달되었음을 볼 수 있지만, $myvar변수를 사용할 때는 변수를 무엇과 함께 사용하는지 $myvar이해해야 합니다 .$myvar

관련 정보