로컬 작업의 오른쪽에 있는 따옴표를 안전하게 생략할 수 있습니까?
function foo {
local myvar=${bar}
stuff()
}
나는 주로 관심이 있지만 bash
다른 쉘의 코너 케이스에 대한 정보는 환영합니다.
답변1
export foo="$var"
또는 local foo="$var"
(또는 readonly
, typeset
및 declare
기타 변수 선언에는 따옴표가 필요함)주문하다) 존재하다:
dash
버전 0.3.8-15 ~ 0.5.10.2(참조변화).- NetBSD
sh
(또한 Almquist 쉘 기반). sh
FreeBSD 9.2 또는 이전 버전(참조9.3의 변경 사항)yash
zsh
5.1 이전 버전에는 에뮬레이션이 포함되어 있었습니다ksh
(sh
또는 단어 분리를 수행export var="$(cmd)"
할 위치zsh
(와일드카드 아님)).
그렇지 않으면 변수 확장은 다른 명령에 대한 인수와 마찬가지로 토큰화 및/또는 파일 이름 생성의 영향을 받습니다.
다음과 같은 경우에는 필요하지 않습니다.
bash
ksh
(모든 구현)- FreeBSD
sh
9.3 이상 - ash 기반의 busybox'
sh
(2005년부터) zsh
dash
0.5.11 이상.
에서는 in 또는 에뮬레이션을 zsh
제외하고 인수 확장 시 분할+glob이 수행되지 않지만 명령 대체 시 분할(glob 아님)이 수행됩니다. 버전 5.1부터 / 및 기타 선언 명령이 이중으로 변경되었습니다.sh
ksh
export
local
핵심 단어/내장위의 다른 셸의 명령과 마찬가지로 이는 sh
/ ksh
에뮬레이션 내에서도 명령 대체의 경우에도 인용이 필요하지 않음을 의미합니다.
일부 특수한 경우에는 이러한 셸에서도 인용이 필요합니다. 예를 들면 다음과 같습니다.
a="b=some value"
export "$a"
=
또는 더 일반적으로 (included)의 나머지 부분이 =
인용되거나 일부 확장의 결과인 경우(예: export 'foo'="$var"
, export foo\="$var"
또는 export foo$((n+=1))="$var"
( $((...))
실제로도 인용되어야 함)...). 즉, export
no 에 있는 경우입니다 export
.
export
/ local
명령 이름 자체가 따옴표로 묶인 경우 ( "export" a="$b"
, 'ex'port a="$b"
, \export a="$b"
, 심지어 와 같은 부분도) AT&T 및 최신 버전의 를 제외하고 ""export a="$b"
는 따옴표가 필요합니다 .$b
ksh
mksh
dash
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"
대한 모든 셸에는 따옴표가 필요합니다 .mksh
ksh93
dash
bash -o posix
command
export
dash
작성되면 어떤 쉘에서도 필요하지 않습니다.
foo=$var export foo
(이 구문은 Bourne 쉘과도 호환되지만 최신 버전에서는 / 에뮬레이션 zsh
에서만 작동합니다 .)sh
ksh
( var=value local var
다른 쉘은 다르게 동작하므로 이것을 사용해서는 안됩니다).
export
또한 할당과 함께 사용하면 cmd
in의 종료 상태가 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