모든 변수가 bash에서 메모리에 문자열로 저장됩니까?


14

다음 변수를 생성했다고 가정 해보십시오.

s=John
i=12345
f=3.14

이러한 모든 변수가 메모리에 문자열로 저장되거나 bash다른 데이터 유형이 있습니까?


1
관심이없는 이유는 무엇입니까? 언어의 기능에 영향을 미치지 않는 한 스와힐리어 텍스트로 저장된 경우 실제로 신경 쓰지 못했습니다 (성능에 영향을 미칠 수 있지만 문제가 될 수 있지만 중요하다면 무기고보다 더 나은 도구입니다) bash).

2
@paxdiablo 중요하지 않습니다. 제가 알고있는 다른 모든 프로그래밍 / 스크립트 언어 (예 : Java, C ++, JavaScript, PHP 등)는 각 데이터 유형마다 고유 한 메모리 표현을 가지고 있기 때문에 호기심을 불러 일으 킵니다. 모든 데이터 유형에 대해 하나의 메모리 표현 만있는 스크립팅 언어를 보는 것이 흥미 롭습니다.
268325

답변:


16

배쉬 변수는 타입이 없다 .

다른 많은 프로그래밍 언어와 달리 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.

참고 문헌 :


13

Bash에는 기본적으로 일반 스칼라 변수, 배열 및 연관 배열이 있습니다. 또한 스칼라에 declare내장을 사용하여 정수로 태그를 지정할 수 있습니다 . 스크립트 프로그래머 / 쉘 사용자 관점에서 문자열 변수는 문자열로, 정수 변수는 정수로, 배열은 유형에 따라 배열됩니다. 내부 구현은별로 관련이 없습니다.


그러나 데이터가 실제로 메모리에 어떻게 저장되는지 알고 싶다면 소스 코드를 검사하여 프로그램의 실제 기능을 확인해야합니다.

Bash 4.4에서는 스칼라가 정수 태그에 관계없이 문자열로 저장됩니다. 이것은로 표시 정의 struct variable/를 SHELL_VAR타입 정의 와의 기능make_variable_value 을 명시 적으로 저장 문자열 정수 변환.

배열은 연결된 목록 ( array.h)으로 보이는 것에 저장 되고 연관 배열은 해시 테이블로 저장됩니다. 그 안의 값은 다시 문자열로 저장됩니다. 배열에 대한 연결된 목록의 선택은 이상하게 보일 수 있지만 배열이 희소 할 수 있고 배열에 포함 된 요소의 수에 관계없이 인덱스가 임의의 숫자가 될 수 있으므로 해당 디자인 선택을 이해하기가 더 쉽습니다.

그러나 코드에는 정수 값, 부동 소수점 숫자 및 문자열 값에 대한 필드와 함께 미사용에union _value 대한 정의도 포함되어 있습니다 . 주석에는 "미래를위한 것"으로 표시되어 있으므로, 일부 Bash 버전에서는 다른 유형의 스칼라를 기본 형식으로 저장할 수 있습니다.


1

내 인생에서 나는이 말을 아무리 많은 단어로도 찾을 수 없지만 이것이 내가 그것을 이해하는 방법이다.

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가 보거나보고 싶은 모든 것입니다.



0

관련이 없습니다.

Bash 변수와 상호 작용하는 유일한 방법은 Bash를 사용하는 것이므로 변수가 메모리에 저장되는 방법에 대한 차이점을 알 수 는 없습니다 . 메모리를 통해 변수에 직접 액세스 할 수 없기 때문에 항상 Bash에 요청해야합니다. 값 및 배쉬는 그것을 원하는 어떤 방법으로 그들을 변환 할 수 있습니다 보면 그들은 마치 특정 방식에 저장된.

실제로 메모리 에 전혀 저장되지 않을 수도 있습니다 . Bash의 일반적인 구현이 얼마나 영리한지 모르겠지만 간단한 경우에는 변수의 사용 여부 및 / 또는 수정 여부를 결정하고 완전히 또는 인라인으로 최적화 할 수 있습니다.


나는 질문의 포인트는 표현보다는 생각 위치
bu5hman

2
내 요점은 당신이 있다는 것입니다 수 없습니다 당신이 그것을 관찰 할 수 없기 때문에, 표현을 알고있다. 따라서 관련성이 없으며 사용자가 알지 못하면 변경 될 수 있습니다. Bash가 어떤 표현을 선택할지 말하기는 불가능합니다. 구현의 소스 코드를 조사하고 어떤 표현을 선택했는지 확인할 수 있지만 다음 패치 릴리스에서 내일 표현을 변경할 수 있으며 알 방법이 없습니다.
Jörg W Mittag

Schroedingers 변수? 나는 기본 표현이 관련이 없다는 것에 기본적으로 동의하지만 (내 대답 참조) bash를 사용하면 효과적으로 '인터페이스에 코딩'하고 인터페이스의 표현은 엄격합니다.
bu5hman

2
예, 그러나 질문은 인터페이스 경계에서의 표현에 관한 것이 아니라 특히 "메모리에 저장되는"방법에 관한 것입니다. 그리고 그 질문에, 나는 대답 할 것입니다. 우리는 알 수없고, 알 수없고, 알 수 없습니다.
Jörg W Mittag

내가 말했듯이, 우리는 동의합니다 ... OPs 담당자와 질문의 성격을 감안할 때, 그들은 그들의 숙제에 대해 합리적인 점수를받을 것이라고 생각합니다. 인용됩니다 ;-).
bu5hman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.