我对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
因此它只创建第一级文件夹
答案 0 :(得分:4)
这里有三个问题:
#!/bin/bash
#!/bin/sh
开头
echo $ARRAY
将仅输出数组的第一个元素,而不是整个数组,这就是为什么它看起来只是在做第一个元素 - 它不是,但它只是打印第一个元素。使用echo ${ARRAY[@]}
输出整个数组。DIR_LEVEL_2
,但你正在迭代${DIR_LEVEL2[@]}
,它是空的(因此没有迭代)。您在2
答案 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
。