4

私は bash スクリプトにかなり慣れていませんが、このスクリプトが期待どおりに機能しない理由を理解できないため、明らかにかなり基本的な理解が欠けています。問題を再現する簡単な例を作成しました。3つのフォルダーを作成し、3つのフォルダーを内部に作成しtest、それぞれの内部にファイルをタッチすることになっています。

スクリプトは次のとおりです。

#!/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 ループに入っていないことでした。そのエコーを入れたところ、スクリプトの出力が次のように 2 番目の配列が適切に作成されていないように見えます。

1/a
2/a
3/a

これは配列の最初の要素です。

これは、ネストされた for ループに注意を-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

したがって、最初のレベルのフォルダーのみが作成されます

4

2 に答える 2

4

ここには 3 つの問題があります。

  1. #!/bin/bashbash を使用する場合は、スクリプトを で開始する必要があります。#!/bin/sh
  2. echo $ARRAY配列全体ではなく、配列の最初の要素のみを出力するため、最初の要素のみを実行しているように見えます-そうではありませんが、最初の要素を出力しているだけです。echo ${ARRAY[@]}配列全体を出力するために使用します。
  3. 2 番目の配列を繰り返しているとき、変数名が間違っています。あなたの配列はですが、空であるDIR_LEVEL_2を繰り返し${DIR_LEVEL2[@]}ています(したがって、繰り返しはありません)。の前にアンダースコアがありません2
于 2012-04-17T12:09:54.140 に答える
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。それらは同じものではありません。bash の優れた機能セットと引き換えに、sh の優れた移植性を手に入れたいという確信がない限り、#!/bin/bash.

于 2012-04-17T12:07:19.263 に答える