Bash脚本,未按预期创建数组

时间:2012-04-17 11:54:23

标签: bash shell

我对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

我遇到的问题是它没有进入第二个for循环,我输入了echo,看起来第二个数组没有正确创建,因为脚本的输出是:

1/a
2/a
3/a

这只是数组的第一个元素。

使用-xv标志运行我得到了这个,这表明它没有注意到嵌套for循环(我猜因为数组没有像我想的那样被创建?)

#!/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

因此它只创建第一级文件夹

2 个答案:

答案 0 :(得分:4)

这里有三个问题:

  1. 如果您想使用bash而不是#!/bin/bash
  2. ,则脚本应以#!/bin/sh开头
  3. echo $ARRAY将仅输出数组的第一个元素,而不是整个数组,这就是为什么它看起来只是在做第一个元素 - 它不是,但它只是打印第一个元素。使用echo ${ARRAY[@]}输出整个数组。
  4. 当您迭代第二个数组时,您的变量名称错误。你的数组是DIR_LEVEL_2,但你正在迭代${DIR_LEVEL2[@]},它是空的(因此没有迭代)。您在2
  5. 之前缺少下划线

答案 1 :(得分: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