为什么嵌套的for循环会生成错误的数字?

时间:2019-04-09 12:28:55

标签: bash for-loop nested-loops

我想做什么

我想创建子文件夹以及一些新的子文件夹,它们的名称仅包含数字0和1。 我为此使用了嵌套的for循环。 该脚本以某种方式生成具有3,4,5,6,7,8,9的文件夹。 我找不到问题或解决方案。

我已经做了

我已经在每个循环中实现了回显,该回显显示了不同变量的内容,该变量始终为0或1。 我还放置了一个if语句,其中在循环完成后将变量重置为0。由于echo可以显示正确的内容,因此不需要if语句。

DIR=/home/$USER/testdaten
mkdir /home/$USER/testdaten

for a in {0..1}; do
    mkdir $DIR/$( printf %01d $a)
    echo $DIR/$( printf %01d "$a")
    echo $a $b $c $d
    for b in {0..1}; do
        mkdir $DIR/$a/$( printf %02d $a$b)
        echo $DIR/$a/$( printf %02d $a$b)
        echo $a $b $c $d
        for c in {0..1}; do
            mkdir $DIR/$a/$a$b/$( printf %03d $a$b$c)
            echo $DIR/$a/$a$b/$( printf %03d $a$b$c)
            echo $a $b $c $d
            for d in {0..1}; do
                mkdir $DIR/$a/$a$b/$a$b$c/$( printf %04d $a$b$c$d)
                echo $DIR/$a/$a$b/$a$b$c/$( printf %04d $a$b$c$d)      
                echo $a $b $c $d 
            done
        done
    done
done


alternative:

for ((a=0; a<=1; a++)); do
mkdir $DIR/$( printf %01d "$a")
    for ((b=0; b<=1; b++)); do
        mkdir $DIR/$a/$( printf %02d "$a$b")
        for ((c=0; c<=1; c++)); do
            mkdir $DIR/$a/$a$b/$( printf %03d "$a$b$c")
            for ((e=0; e<=1; e++)); do
                mkdir $DIR/$a/$a$b/$a$b$c/$( printf %04d "$a$b$c$e")       
            done
        done
    done
done
/home/$USER/testdaten/0
0
/home/$USER/testdaten/0/00
0 0
/home/$USER/testdaten/0/00/000
0 0 0
/home/$USER/testdaten/0/00/000/0000
0 0 0 0
/home/$USER/testdaten/0/00/000/0001
0 0 0 1
/home/$USER/testdaten/0/00/001
0 0 1 1
/home/$USER/testdaten/0/00/001/0008
0 0 1 0
/home/$USER/testdaten/0/00/001/0009
0 0 1 1
/home/$USER/testdaten/0/01
0 1 1 1
/home/$USER/testdaten/0/01/008
0 1 0 1
mkdir: das Verzeichnis »/home/$USER/testdaten/0/01/010/0064“ kann nicht angelegt werden: Datei oder Verzeichnis nicht gefunden
/home/$USER/testdaten/0/01/010/0064
0 1 0 0
mkdir: das Verzeichnis »/home/$USER/testdaten/0/01/010/0065“ kann nicht angelegt werden: Datei oder Verzeichnis nicht gefunden
/home/$USER/testdaten/0/01/010/0065
0 1 0 1
/home/e$USER/testdaten/0/01/009
0 1 1 1
mkdir: das Verzeichnis »/home/$USER/testdaten/0/01/011/0072“ kann nicht angelegt werden: Datei oder Verzeichnis nicht gefunden
/home/$USER/testdaten/0/01/011/0072
0 1 1 0
mkdir: das Verzeichnis »/home/$USER/testdaten/0/01/011/0073“ kann nicht angelegt werden: Datei oder Verzeichnis nicht gefunden
/home/$USER/testdaten/0/01/011/0073
0 1 1 1
/home/$USER/testdaten/1
1 1 1 1
/home/$USER/testdaten/1/10
1 0 1 1
/home/$USER/testdaten/1/10/100
1 0 0 1
/home/$USER/testdaten/1/10/100/1000
1 0 0 0
/home/$USER/testdaten/1/10/100/1001
1 0 0 1

错误提示无法创建目录:找不到文件或目录

2 个答案:

答案 0 :(得分:0)

好吧,我刚刚删除了printf中的参数%01等,它现在可以工作了。 参考mickp的评论,数字被视为八进制,然后转换为十进制会导致错误,而其他数字

Octal=decimal
10=8
11=9
100=64
101=65
110=72
111=73

答案 1 :(得分:0)

只需详细说明一下,因为已经解决了...

printf "%04d\n" 0101 # leading zero tells %d this input is octal 65
0065

printf "%04s\n" 0101 # %s reads a string (but can still pad with 0's
0101