2017-02-20 7 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とは関係があると思います。

私はシンプルなスクリプトを作成します。bashの実行ファイルとしてchmod +xセットにそれをすることを

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

それができる:これは、出力は(私はmagicというフォルダにいる)である

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

を?

+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 + =($ x);完了しました。 echo $ numbers; 'bashはこの1ビットを気に入らず、' echo $ {numbers [@]} 'で配列を出力させます。おそらくあなたの端末はbashですが、あなたはzshでスクリプトを実行していますか? 'echo $ SHELL'を試して、何がポップアップしているのを見てください。 – JNevill

+0

私は 'csh'、' ksh'、 'fish'でもそのループを試しました。 'csh'と' fish'には構文エラーがあり、 'ksh'は' bash'のように動作していたので、あなたのユーザのデフォルトシェルはその2つのうちの1つです。 – JNevill

答えて

2

zshでコードを実行しています。echo $numbersは、配列全体の内容を出力します。スクリプトではsh(シバンがない)で実行されているので、echo $numbersecho ${numbers[0]}に相当し、最初の要素のみが出力されます。あなたはそれを引用しているため(あなたの配列構文はまだそうでない場合は動作しますので、shは、bashへのリンクのように見える。)

あなたa配列は、しかし、唯一のは、一つの要素、文字列foo bar bazを持っています。複数の要素を追加するには、a+=(foo bar baz)を使用します。そのため、空白はリテラルスペースではなく別の配列要素を区切ると解釈されます。

$SHELLの値は、現在実行されているシェルの名前ではなく、デフォルトのシェルの名前です。

関連する問題