name=Jackson
echo $name
이것은 잭슨을 보여줍니다.
name="Jackson"
echo $name
잭슨도 선보일 예정이다.
그래서 변수 주위에 따옴표를 넣으면 문자열이 된다고 가정합니다. 엄밀히 말하면 name=Jackson은 무엇인가요? 문자열로도 인식되나요?
답변1
Linux 환경 변수는 항상 문자열입니다. 문자열에 특수 문자(셸 메타 문자 또는 공백)가 포함된 경우에만 따옴표가 필요합니다. 쉘 메타문자는 다음과 같습니다:
<>()[]{}*?$|&#\;`'"
$, \ 및 `의 경우 큰따옴표는 그 안에서 확장되기 때문에 충분하지 않습니다. 여기서는 작은따옴표를 사용하거나 \로 이스케이프 처리해야 합니다.
주석에서 지적했듯이 bash에는 특별한 유형의 변수가 있지만 거의 필요하지 않으며 모든 bash 변수도 기본적으로 문자열입니다.
답변2
Bash는 강력한 유형이 아닙니다. 1 유일한 중요한 차이점은 스칼라 유형과 복합 유형(배열) 사이입니다. 스칼라는 항상 문자열로 처리됩니다., 그러나 산술적으로 사용할 수 있는 "숫자 문자열"이 있습니다.
a="5"
b=10
echo "$a + $b = "$(($a+$b));
"숫자 문자열"은 숫자만 포함하는 문자열이므로 정수 값으로 변환할 수 있습니다. Bash의 모든 스칼라 값은 여전히 문자열일 뿐이며,여기에 있는 성명서의 언급은 관련이 없습니다. a=5
정확히 동일합니다 a="5"
. (예를 들어) 비교 $a
하고 사용하면 숫자로 처리됩니다. 비교를 위해 사용하는 경우 사전순으로 처리됩니다. 결정을 내리는 것은 변수의 특성이 아니라 연산자/컨텍스트입니다.$b
-lt
<
선언된 값이 산술 표현식으로 해석되도록 하는 "정수 플래그"를 사용하여 변수를 선언할 수도 있습니다.
x=10/2
echo "$x" # output: 10/2
declare -i x=10/2
echo "$x" # output: 5
declare -i x=what
echo "$x" # output: 0
이후에 이 변수에 할당된 모든 항목은 산술적으로 해석됩니다.
a=5
declare -i b=10
a=$a/5
b=$b/5
echo "$a $b" #output: 5/5 2
a=hello
b=world
echo $a$b #output hello0
그러나 변수의 내용은 여전히 (숫자) 문자열입니다. 정수 플래그는 문자열의 내용을 제한하고 문자열에 할당된 값의 해석에 영향을 줍니다.
1 이것은 선언된 정수의 경우에서 볼 수 있듯이 단순한 동적 유형도 아닙니다. 어쩌면 우리는 그것을 뭔가라고 부를 수도 있습니다오리 타이핑, 또는에 따르면Bash 고급 스크립팅 가이드, "유형이 없습니다".
답변3
차이점이 있습니다. 시도해 보세요.
unset name
name="Michael Jackson" ; echo "$name"
그리고
unset name #to reset name, see comments
name=Michael Jackson ; echo "$name"
이것은 매우 다릅니다. 두 번째로 "Jackson" 명령을 실행하려고 시도하고 "name=Michael" 환경을 전달합니다. 따라서 "Jackson: 명령을 찾을 수 없습니다"라는 메시지가 표시 됩니다. 다음 줄의 일부는 "jackson" 명령(및 해당 명령만)에만 전달되므로 unset name
"재설정" 이름에 "재설정" 이름을 추가 해야 합니다 . name=Michael
호출 쉘 레벨에서는 수행되지 않습니다! (따라서 name="Michael Jackson"
두 번째 시도 전에 첫 번째 명령으로 다시 설정하지 않으면 여전히 ""
첫 번째 명령이 포함됩니다. 따라서 첫 번째 시도를 잊지 않았다면 "echo $name"은 여전히 People을 만들 것입니다. 혼란스럽게 "Michael Jackson"을 표시합니다.)
대개,언제나정의할 때, 특히 변수를 사용할 때 큰따옴표를 사용하십시오.
cd "${var}"
비교하다
cd $var
두 번째 버전은 $var가 정의되지 않은 경우 항의하는 대신 자동으로 homedir로 이동합니다.
그런 다음 주변의 큰따옴표를 제거한 경우에만알다당신은요필요변수의 각 요소를 다음과 같이 구분합니다.
for i in $var ; do something_using_i ; done