2012-08-10 3 views
3

CentOS의 /etc/init.d/functions에 다음 코드가 있습니다.쉘 스크립트 : "local foo"와 "local foo ="사이에 차이가 있습니까?

status() { 
    local base pid lock_file= pid_file= 
    ... 

4 개의 변수가 선언됩니다. 두 개가 초기화되지 않았습니다. 기본 및 PID입니다. 그러나 나머지는 빈 값, lock_file 및 pid_file로 초기화됩니다.

다음 코드를 테스트 한 결과 차이점이 없음을 발견했습니다.

local a b= 

echo "a is $a, length is ${#a}" 
echo "b is $b, length is ${#b}" 

그들간에 차이가 있습니까?

+0

로컬 기능입니다, 맞습니까? 'foo'의 값을 함수의 외부에 설정하면 어떻게됩니까? (나는 테스트 할 수있는 bash를 가지고 있지 않다). 행운을 빕니다. – shellter

+0

다른 언어와 마찬가지로 우리는 "local declaration statement"에서 외부 변수를 참조 할 수 없습니다. 따라서 외부 변수와 같은 이름의 로컬 변수를 선언하면 다른 변수로 취급됩니다. – taichino

답변

3

예, 거기에 은 차이가입니다. 이 출력 bash-4.x 결과이 함수를 호출

x() { 
    local a b= 

    echo ${a-X} 
    echo ${b-X} 
} 

: 다음의 기능을 고려

$ x 
X 

$ 

파라미터가 설정되지 않은 경우 parameter expansion (이 경우 X에서) word의 팽창에 펼쳐지는 ${parameter−word}, 또는 매개 변수 값이 설정된 경우 매개 변수 값에 적용됩니다.

출력 예에서 local a은 변수 a을 설정하지 않은 채로 두는 것이 분명하고 local b=은 명시 적으로 빈 (null) 문자열로 설정합니다.

편집 : 당신이 얻을 bash-3.x에 한편

: bash-3.x에서 local a를 초기화 할 것을

$ x 


$ 

함수 내 set에 대한 호출이 검증이 빈 문자열로 변수입니다. 그러나 이것은 버그였습니다. bash 변경 로그에서 :

이 문서는이 버전의 bash-4.0 베타, 및 이전 버전의 bash-4.0 알파 사이의 변화를 자세히 설명합니다.

...

e. 값이 아닌 값 대신 빈 문자열을 사용하여 로컬 변수를 만드는 버그가 수정되었습니다.

+0

답변 해 주셔서 감사합니다. 그러나 x 기능이 작동하지 않습니다. 두 개의 빈 줄이 표시됩니다. bash (3.2.48) 및 zsh (4.3.11)을 확인했습니다. 내 환경에 뭔가 이상이 있습니까? – taichino

+0

@taichino : 내 업데이트를 참조하십시오 ... – thkala

+0

대단히 고마워요! 나는 bash-4.2.37로이를 확인할 수 있었다. 쉘 스크립트를 잘 이해하지 못하기 때문에 더 배우게 될 것입니다! – taichino