이 질문은양수인한 변수의 전체 내용을 다른 변수에 복사합니다.
변수가 존재하지 않습니다사용된(등으로 보내기 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"')
\*
이것은 오래 전에 해결되었습니다.