다음 변수를 생성한다고 가정해 보겠습니다.
s=John
i=12345
f=3.14
이러한 변수는 모두 메모리에 문자열로 저장되어 있습니까? 아니면 bash
다른 데이터 유형이 있습니까?
답변1
배쉬 변수는유형이 지정되지 않은.
다른 많은 프로그래밍 언어와 달리 Bash는 변수를 "유형"으로 구분하지 않습니다. 기본적으로 Bash 변수는 문자열이지만 상황에 따라 Bash는 변수에 대한 산술 연산 및 비교를 허용합니다. 결정 요인은 변수 값에 숫자만 포함되어 있는지 여부입니다.
~처럼또 다른 답변은 다음과 같습니다,종류약한 형태타이핑을 사용하세요 declare
.
이는 일부 프로그래밍 언어에서 사용할 수 있는 매우 약한 형식의 유형[1]입니다.
예를 살펴보세요:
declare -i number # The script will treat subsequent occurrences of "number" as an integer. number=3 echo "Number = $number" # Number = 3 number=three echo "Number = $number" # Number = 0 # Tries to evaluate the string "three" as an integer.
인용하다:
답변2
Bash에는 기본적으로 일반 스칼라 변수, 배열 및 연관 배열이 있습니다. 또한 스칼라는 다음과 같이 정수로 표시될 수 있습니다.declare
내장. 스크립트 프로그래머/셸 사용자의 관점에서 문자열 변수는 문자열로 작동하고 int 변수는 정수로 작동하며 배열은 해당 유형에 따라 작동합니다. 내부 구현은 그다지 관련성이 없습니다.
그러나 데이터가 실제로 메모리에 어떻게 저장되는지 알고 싶다면 소스 코드를 조사하여 프로그램이 실제로 무엇을 하는지 이해해야 합니다.
Bash 4.4에서 스칼라는 정수 표기법에 관계없이 문자열로 저장됩니다. 이 작업은 다음에서 수행할 수 있습니다.struct variable
/ SHELL_VAR
typedef 정의그리고기능make_variable_value
, 저장을 위해 정수를 문자열로 명시적으로 변환합니다.
배열은 연결된 목록(array.h
) 및 연관 배열을 해시 테이블로 사용합니다. 그 안의 값은 다시 문자열로 저장됩니다. 배열 연결 목록을 선택하는 것이 이상하게 보일 수 있지만 배열이 희박할 수 있고 배열에 포함된 요소 수에 관계없이 인덱스가 임의의 숫자일 수 있으므로 이 디자인 선택은 이해하기 더 쉽습니다.
그러나 코드에는 정의도 포함되어 있습니다.사용되지 않음union _value
, 정수, 부동 소수점 숫자 및 문자열 값을 포함하는 필드입니다. 주석에 "미래 보장"이라고 표시되어 있으므로 일부 향후 버전의 Bash는 다양한 유형의 스칼라를 기본 형식으로 저장할 수 있습니다.
답변3
내 인생에서 나는 이것을 표현할 단어를 그렇게 많이 찾을 수 없지만 이것이 내가 그것을 이해하는 방법입니다.
Bash는 컴파일러가 아닌 인터프리터이며 모든 변수를 문자열로 나타냅니다. 따라서 모든 노력과 집중은 다양한 확장과 함께 제공됩니다.
배쉬 패스모두declare
문자열로 명명된 변수속성이 변수를 제어하는 방법확장하다저장 으로 declare
.
banana=yellow #no call to declare
declare -p banana
declare -- banana="yellow" #but declare was invoked with --
declare -i test=a #arithmetic expansion to null/zero
declare -p test
declare -i test="0"
declare -i test2=5+4 #successful arithmetic expansion
declare -p test2
declare -i test2="9"
declare -i float=99.6 #arithmetical expansion fails due to syntax
bash: declare: 99.6: syntax error: invalid arithmetic operator (error token is ".6")
nofloat=99.9
declare -p nofloat
declare -- nofloat"99.6" #Success because arithmetical expansion not invoked
declare -a a #variable is marked as a placeholder to receive an array
declare -p a
declare -a a
a[3]=99 #array elements are appended
a[4]=99
declare -p a
declare -a a=([3]="99" [4]="99")
declare -A newmap #same as -a but names instead of numbers
newmap[name]="A Bloke"
newmap[designation]=CFO
newmap[company]="My Company"
declare -p newmap
declare -A newmap=([company]="My Company" [name]="A Bloke" [designation]="CFO" )
그리고 물론
declare -ia finale[1]=9+16
declare -p finale
declare -ai finale=([1]="25")
결국 declare
내부 표현이 속성 플래그로 변경되더라도 bash가 보거나 보려는 모든 것은 문자열이라는 것입니다.
답변4
이것은 관련이 없습니다.
Bash 변수와 상호 작용하는 유일한 방법은 Bash를 통해서입니다.불가능한변수가 메모리에 저장되는 방식의 차이점을 확인할 수 있습니다.메모리를 통해 직접 접근하지 마세요., 항상 Bash에게 값을 요청해야 하며 그러면 Bash가 원하는 방식으로 값을 번역할 수 있습니다.바라보다그들처럼가지다특정 방식으로 저장됩니다.
실제로 메모리에 저장되지 않을 수도 있습니다.별말씀을요. Bash의 일반적인 구현이 얼마나 스마트한지는 모르겠지만, 적어도 간단한 경우에는 변수가 사용될지 여부 및/또는 수정되어 완전히 최적화되거나 인라인될지 여부를 결정할 수 있습니다.