2017-02-20 6 views
0

대 스크립트에서 배열 요소 다른 동작을 추가 나는 다음과 같은 코드를 가지고 : 나는 대화 형으로 복사/붙여 넣기이를 통해 쉘에서이 프로그램을 실행할 때배쉬 : 대화 형 쉘

numbers=() 
a=() 
a+=('foo bar baz') 
for ((x=0; x<=9; x++)); 
do 
    numbers+=($x) 
done 

echo $numbers 
echo $a 

, 그때 내가 원하는 출력을 얻을 수를 어느입니다

➜ echo $numbers 
0 1 2 3 4 5 6 7 8 9 
➜ echo $a 
foo bar baz 

그러나, 나는 내가 할 스크립트로 실행하면

0 
foo bar baz 

이유는 무엇입니까? 대화 형 셸을 사용하여 어떻게 동작시킬 수 있습니까?

전체 공개 : 나는 광범위하게 검색하여 찾을 수 없습니다. 나는 zsh를 실행하고이 경우 bash와 같다고 가정한다. 나는 bash와 대화식 쉘에 대해 익숙하지 않은데 비해 파일의 차이점에 대해서 잘 알고있다.

편집은 도움이 코멘트를 후 지금은 이상한 범인을 발견. 나는 그것이 chmod +x과 관련이 있다고 생각합니다. 이 출력 (I가 magic라는 폴더에있어)입니다

for ((x=0; x<=9; x+=1)) do numbers+=($x); done; echo $numbers; 
echo $SHELL 

:

나는 간단한 스크립트 작성

chmod +x ./test 
➜ magic ./test 
0 
/bin/zsh 
➜ magic zsh ./test 
0 1 2 3 4 5 6 7 8 9 
/bin/zsh 

이 될 수를 그 떠들썩한 실행 파일과 chmod +x 세트를 ?

+0

다른 관찰 된 동작이있는 이유는 아직도 알지 못하지만이 답변은 저의 구체적인 문제를 해결하는 데 도움이되었습니다. http://unix.stackexchange.com/questions/211395/in-a-loop-over-an- array-add-an-element-to-the-array - 나는 왜 그 차이가 있는지 궁금해. –

+0

zsh에서 차이점을 재현 할 수 없습니다. ZSH는 쉘 스크립트 내에서 또는 for (x = 0; x <= 9; x + = 1))와 함께 터미널에서 행복하게 보인다. do numbers + = ($ x); 끝난; echo $ numbers;'bash는이 비트를 좋아하지 않으며'echo $ {numbers [@]} '로 배열을 출력하도록합니다. 아마도 터미널이 bash이지만 zsh에서 스크립트를 실행하고 있습니까? 'echo $ SHELL'을 시도하고 어떤 것이 튀어 나오는 지보십시오. – JNevill

+0

나는 또한 'csh','ksh','fish'에서 그 루프를 시도했다. 'csh'와'fish'는 문법 오류가 있었고'ksh'는'bash'처럼 행동했습니다. 따라서 여러분의 사용자 쉘은이 둘 중 하나라고 가정합니다. – JNevill

답변

2

echo $numbers 코드가 전체 배열의 내용을 출력하는 터미널에서 zsh에 코드를 실행하고 있습니다. 이 스크립트에서는 sh (샴페인이 없음)으로 실행되므로 echo $numbersecho ${numbers[0]}과 동일하며 첫 번째 요소 만 출력합니다. (배열 구문은 아직 그렇지 않으면 작동하기 때문에 귀하의 sh 나타납니다이 bash에 대한 링크합니다.)

귀하의 a 배열, 당신이 그것을 인용하기 때문에 단, 는, 하나의 요소, 문자열 foo bar baz 있습니다. 여러 요소를 추가하려면 a+=(foo bar baz)을 사용하십시오. 따라서 공백은 리터럴 공간이 아닌 별도의 배열 요소를 분리하는 것으로 해석됩니다.

$SHELL의 값은 현재 실행중인 셸의 이름이 아닌 기본 셸의 이름입니다.