2012-04-17 7 views
4

私はbashスクリプティングには新しく、明らかに、このスクリプトが期待していなかった理由を理解できないので、かなり基本的な理解が欠けています。私は問題を再現した簡単な例を作りました。内側に3つのフォルダを持つ3つのフォルダを作成し、それぞれにファイルtestをタッチすることになっています。ここでBashスクリプト、配列が期待どおりに作成されない

はスクリプトです:

#!/bin/sh 
DIR_LEVEL_1=("1" "2" "3") 
for DIR_1 in ${DIR_LEVEL_1[@]}; do 
    mkdir $DIR_1 
    DIR_LEVEL_2=("$DIR_1/a" "$DIR_1/b" "$DIR_1/c") 
    echo $DIR_LEVEL_2 
    for DIR_2 in ${DIR_LEVEL2[@]}; do 
    mkdir $DIR_2 
    touch "$DIR_2/test" 
    done 
done 

私が持っていた問題は、それが2番目のforループに入っていなかったし、私はそのエコーに入れ、二番目の配列が正しく作成されていないように見えますスクリプトの出力は次のとおりです。

1/a 
2/a 
3/a 

これは配列の最初の要素です。だから、唯一の作成(私が望んでいたように、アレイが作成されませんでしたので、私は推測?)それはループのためにそのネストされたの何の予告を取っていないです示しており、私はこれを取得-xvフラグで

#!/bin/sh 
DIR_LEVEL_1=("1" "2" "3") 
+ DIR_LEVEL_1=("1" "2" "3") 
for DIR_1 in ${DIR_LEVEL_1[@]}; do 
    mkdir $DIR_1 
    DIR_LEVEL_2=("$DIR_1/a" "$DIR_1/b" "$DIR_1/c") 
    echo $DIR_LEVEL_2 
    for DIR_2 in ${DIR_LEVEL2[@]}; do 
    mkdir $DIR_2 
    touch "$DIR_2/test" 
    done 
done 
+ for DIR_1 in '${DIR_LEVEL_1[@]}' 
+ mkdir 1 
+ DIR_LEVEL_2=("$DIR_1/a" "$DIR_1/b" "$DIR_1/c") 
+ echo 1/a 
1/a 
+ for DIR_1 in '${DIR_LEVEL_1[@]}' 
+ mkdir 2 
+ DIR_LEVEL_2=("$DIR_1/a" "$DIR_1/b" "$DIR_1/c") 
+ echo 2/a 
2/a 
+ for DIR_1 in '${DIR_LEVEL_1[@]}' 
+ mkdir 3 
+ DIR_LEVEL_2=("$DIR_1/a" "$DIR_1/b" "$DIR_1/c") 
+ echo 3/a 
3/a 

を実行している

最初のレベルのフォルダ

答えて

3

あなたのスクリプトの実際の問題は、DIR_LEVEL_2を作成することですが、DIR_LEVEL2を反復することです。 (アンダースコアの違いに注意してください)。しかし、あなたはまた"${array[@]}"を引用することを怠ります。つまり、正しく単語を分割しません。それ以外は、ブレース拡張を使用して、この全体をより良いエクスペリエンスにすることをお勧めしますか?

#!/bin/bash 

dirs=({1,2,3}/{a,b,c}) 
mkdir -p "${dirs[@]}" 
for d in "${dirs[@]}"; do 
    touch "$d/test" 
done 

編集/追伸:私はあなたのスクリプトが上記#!/bin/shを使用しています気付いていますが、この記事bashをタグ付けしました。彼らは同じことではありません。 shの移植性を高めるために、bashのより大きなフィーチャーセットを交換したいと確信していない限り、#!/bin/bashを使用してください。

+1

mkdir -p {1,2,3}/{a、b、c}; {1,2,3}/{a、b、c}/test –

+0

@WilliamPursellを真にタッチする。私は適切に(配列の展開を引用することを含む)ループの例を残したかったのですが、私はループが手元の実際のタスクには不要であると述べていたはずです。 – kojiro

4

あなたがここに三つの問題があります:あなたはbashのを使用したい場合は

  1. をスクリプトがない#!/bin/sh
  2. echo $ARRAY意志出力配列の最初の要素だけではなく、配列全体、#!/bin/bashで始まる必要があり、それが最初の要素のみを実行しているように見えるのはなぜですか?そうではありませんが、最初の要素を印刷しているだけです。配列全体を出力するにはecho ${ARRAY[@]}を使用してください。
  3. 2番目の配列を反復処理するときに、変数名が間違っています。配列はDIR_LEVEL_2ですが、反復処理は${DIR_LEVEL2[@]}です。これは空です(繰り返しはありません)。あなたの前にアンダースコアがありません。2
+0

ああありがとう!私は混乱していました。なぜなら、通常は未定義の変数に何らかのエラーがあると思います。私はまた、変数を宣言するときに '='の後ろにスペースを置いていたサンプルにそれをつけなかった私の主なスクリプトでもう一度間違ったことをちょっとしてしまいました。 ! – GP89

+0

シェル構文は、実行コマンドと共存しなければならないため、スペースなどについてはあまり気にしません。したがって、 'foo = bar'は2つの引数、' = 'と' bar'を持つ 'foo'コマンドを実行し、' foo = bar'は代入です。 未定義の変数にアクセスするときにエラーを表示するには、スクリプトの先頭に 'set -u'を追加します。 –

関連する問題