매개변수 확장 시:
큰따옴표를 사용한 매개변수 확장은 큰따옴표가 없는 것보다 항상 더 좋습니까(또는 나쁠까요)? 큰따옴표가 권장되지 않는 상황이 있습니까?
매개변수 이름 주위에 중괄호를 언제 추가해야 합니까?
매개변수 이름 주위에 중괄호 대신 매개변수 확장 주위에 큰따옴표를 사용해야 하는 경우는 언제입니까? 그 반대는 언제쯤 될까요? 둘 중 하나는 언제 작동합니까?
감사해요.
답변1
인용하다
확장된 값을 유지하려는 경우 참조 매개변수 확장이 항상 더 좋습니다.아니요단어로 나누어 IFS 값의 영향을 받습니다. 예를 들어:
$ IFS=" elr"
$ var="Hello World"
$ printf '<%s> ' $var; echo
<H> <> <> <o> <Wo> <> <d>
$ printf '<%s> ' "$var"; echo
<Hello World>
그러나 실제로 분할을 완료하기 위해 인용되지 않은 확장이 필요한 매우 제한적인 경우가 있습니다.
$ IFS=$' \t\n'
$ var="one two three"
$ array=($var)
$ declare -p array
declare -a array=([0]="one" [1]="two" [2]="three")
이 주제에 대한 링크:
언제 큰따옴표가 필요합니까?
자일스
스티븐 차제라스
바지 멜빵
변수 이름 뒤의 문자를 해당 변수 이름과 연결해서는 안 되는 경우 항상 중괄호가 필요합니다.
$ var=one
$ echo "The value of var is $varvalue"
The value of var is
$ echo "The value of var is ${var}value"
The value of var is onevalue
~에서LESS="+/which is not to be interpreted as part" man bash
${parameter}
매개변수 뒤에 이름의 일부로 해석되지 않는 문자가 오는 경우 중괄호가 필요합니다.
또한 두 자리 위치 인수를 처리할 때는 중괄호가 필요합니다.
$ set -- one two t33 f44 f55 s66 s77 e88 n99 t10 e11 t12
$ echo "$11 ${11} $12 ${12}"
one1 e11 one2 t12
매뉴얼을 읽어보세요:LESS="+/enclosed in braces" man bash
두 개 이상의 숫자로 구성된 위치 인수를 확장하는 경우 중괄호로 묶어야 합니다.
또는LESS="+/with more than one digit" man bash
${parameter}
매개변수의 값이 대체됩니다. 인수가 두 자리 이상의 위치 인수인 경우 중괄호가 필요합니다.
따옴표 및 중괄호
매개변수 이름 주위에 중괄호 대신 매개변수 확장 주위에 큰따옴표를 사용해야 하는 경우는 언제입니까? 그 반대는 언제쯤 될까요? 둘 중 하나는 언제 작동합니까?
"해야 한다"는 규칙은 없으며 다음 중 하나를 사용할 가능성이 열려 있습니다.
$ var=One
$ echo "ThisIs${var}Var"
ThisIsOneVar
$ echo "ThisIs""$var""Var"
ThisIsOneVar
$ echo 'ThisIs'"$var"'Var'
ThisIsOneVar
$ echo 'ThisIs'"${var}"'Var'
ThisIsOneVar
모든 확장은 완전히 동일하므로 원하는 것을 사용하세요.
답변2
중괄호가 필요한 상황 중 하나는 변수를 문자열의 일부로 사용하려는 경우입니다.
$ var=test
$ echo "stuff$varmorestuff"
stuff
$ echo "stuff${var}morestuff"
stufftestmorestuff
중괄호가 없으면 쉘은 내가 which라는 이름의 설정되지 않은 변수를 확장하려고 한다고 생각할 것입니다 varmorestuff
.
Bash 참조 매뉴얼에서3.5.3 쉘 매개변수 확장:
'$' 문자는 매개변수 확장, 명령 대체 또는 산술 확장을 소개합니다. 확장할 매개변수 이름이나 기호는 중괄호로 묶을 수 있습니다. 이는 선택 사항이지만 이름의 일부로 해석될 수 있는 바로 다음 문자로부터 확장되는 변수를 보호하는 데 사용됩니다.
쉘 매뉴얼에서2.6.2 매개변수 확장
매개변수 이름이나 기호가 중괄호로 묶이지 않은 경우 확장은 해당 이름으로 표시되는 기호의 존재 여부에 관계없이 가장 긴 유효한 이름을 사용해야 합니다(IEEE Std 1003.1-2001의 기본 정의 볼륨, 섹션 3.230, 이름 참조). .
또한 두 자리 위치 인수를 처리할 때 중괄호가 필요합니다.
스크립트 파일
#!/bin/sh
if [ "$1" = 'correct' ]; then
echo "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}"
else
echo "$2" "$3" "$4" "$5" "$6" "$7" "$9" "$9" "$10"
fi
실행 중:
$ ./script.sh one two three four five six seven eight nine ten
two three four five six seven nine nine one0
$ ./script.sh correct two three four five six seven eight nine ten
two three four five six seven eight nine ten
배쉬 매뉴얼에서3.4.1 위치 매개변수
위치 매개변수 N은 ${N}으로 인용되거나 N이 단일 숫자로 구성되는 경우 $N으로 인용될 수 있습니다.
쉘 매뉴얼 2.6.2 매개변수 확장에서 발췌
매개변수 이름이나 기호는 중괄호로 묶을 수 있습니다. 단, 두 자리 이상의 위치 인수가 있거나 인수 뒤에 이름의 일부로 해석될 수 있는 문자가 오는 경우 중괄호는 선택 사항입니다. 일치하는 닫는 중괄호는 중괄호 수준 계산, 인용 문자열 건너뛰기 및 명령 대체를 통해 결정되어야 합니다.