加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读