Bash脚本,未按预期创建数组
发布时间:2020-12-15 21:15:36 所属栏目:安全 来源:网络整理
导读:我很擅长bash脚本,我显然缺少一些相当基本的理解,因为我无法弄清楚为什么这个脚本没有像我期望的那样做.我已经做了一个简单的例子来重现这个问题,它应该制作3个文件夹,里面有3个文件夹,然后触摸每个文件夹里面的文件测试. 这是脚本: #!/bin/shDIR_LEVEL_1=(
我很擅长bash脚本,我显然缺少一些相当基本的理解,因为我无法弄清楚为什么这个脚本没有像我期望的那样做.我已经做了一个简单的例子来重现这个问题,它应该制作3个文件夹,里面有3个文件夹,然后触摸每个文件夹里面的文件测试.
这是脚本: #!/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 所以它只创建第一级文件夹 解决方法
那么,你的脚本的真正问题是你创建了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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |