따옴표 없이 쉘에서 하나의 변수를 다른 변수에 할당하는 데 문제가 있습니까? [복사]

따옴표 없이 쉘에서 하나의 변수를 다른 변수에 할당하는 데 문제가 있습니까? [복사]

이 질문은양수인한 변수의 전체 내용을 다른 변수에 복사합니다.

변수가 존재하지 않습니다사용된(등으로 보내기 echo)

아니요매개변수 확장작업 중 완료되었습니다.

내 질문은 POSIX 셸에만 관련되어 있습니다(여기에서는 배열이 사용되지 않습니다).

error="You have an error in your input"

newVar="$error"
# vs.
newVar=$error
#         ↑
#         └─This assignment is the question. It doesn't seem that quotes are
#           needed here in order to assign the entire contents of $error to
#           a new variable.

#                 ┌─(But quotes are required when they're used.)
#                 ↓
printf "%s\n" "$error"
# => You have an error in your input
printf "%s\n" "$newVar"
# => You have an error in your input

내 글에 내가 놓친 함정이 있나요 newVar=$error?

고쳐 쓰다:

의 내용에 관계없이 오류가 발생하거나 데이터가 손상되지 않고 $error동일한 데이터가 유지되는지 알고 싶습니다 .$newVar

$ error="Test * ${1} \n [!a] [[:punct:]] ./test \t \n \\"
$ newVar=$error
#       ↑
#       └─Does this step ever fail or cause the two variables to differ?
$ echo "$error"
Test *  \n [!a] [[:punct:]] ./test \t \n \
$ echo "$newVar"
Test *  \n [!a] [[:punct:]] ./test \t \n \

답변1

Bourne과 유사한 쉘에서( 일부 쉘의 이전 구현에서 버그 1을 잊어버린 경우)

var=$otherVar

매우 좋은. 스칼라 변수에 할당하므로 여기서는 glob+splitting을 사용할 수 없으므로 작성할 필요가 없습니다 var="$otherVar"(여기서는 따옴표가 문제가 되지 않지만).

예외는 다음과 같습니다:

var=$*

그리고:

var=$@

.은 첫 번째 문자가 공백이 아닌 경우 에만 사용해야 합니다 var="$*".var=$@ var=$* var="$@"$IFS

물론 다음과 같습니다.

array=("$var")

따옴표가 필요합니다. 그렇지 않으면 배열 요소가 분할+글로빙의 결과로 할당됩니다 $var.

또한 다음 따옴표가 필요합니다.

export var="$otherVar"

많은 쉘이 있습니다(여기에는 간단한 명령이 있으므로 분할+글로브가 발생합니다).

그리고:

env var="$otherVar" cmd

또는

awk -v var="$otherVar"...

의심스러운 경우에는 따옴표를 사용하세요.


1일부 이전 버전에서는 시뮬레이션할 zsh때 와일드카드 문자 앞에 백슬래시 문제가 있습니다 sh.

$ (a='\*' exec -a sh zsh-3.1.9 -c 'b=$a; printf "%s\n" "$b"')
*
$ (a='\*' exec -a sh zsh-3.1.9 -c 'b="$a"; printf "%s\n" "$b"')
\*

이것은 오래 전에 해결되었습니다.

관련 정보