Issue with Bash Script creating Directories from Arrays

Issue at hand

I am trying to write a bash script to quickly create a directory structure. This is an attempt to learn more about manipulating arrays, variables, and using loops. My script works to check for the existence of a directory then create folders. The issue I am having is creating a third level of directories within the first two layers.

Goals

I want to be able to write a bash script that will create a directory structure of ~/a/a/a, ~/a/a/b, ~/a/a/c,...,~/a/z/z for example. This should be flexible to so I could use any kind of array or variable that would be suitable.

Here is what I have worked out so far:

#!/bin/bash
array_0=(one two three four five)
array_1=(x y z)

if [ ! -d "directory" ]; then
    mkdir directory
fi
for array_0 in "${array_0[@]}"
do
    mkdir ~/directory/$array_0/
done
if [ -d "~/directory/$array_0/" ]; then
   for array_1 in "${array_0[@]}"
   do
       mkdir ~/directory/$array_0/$array_1
   done
fi
exit 0

Problem

The error I get is mkdir: cannot create directory '/home/user/directory/one/x' : No such file or directory

Other attempts at this script allow me to create ~/directory and ~/directory/one, ~/directory/two,..., ~/directory/five without fail but not the next level i.e /directory/one/x and etc.

How can I script the creation of this directory structure? Is this possible using arrays or is there another method?

For reference I tried to implement this post and elements from this post but I have not had any luck creating the directory structure that I want.

Answer

You could use a nested array loop, like this

#!/bin/bash
array_0=(one two three four five)
array_1=(x y z)

for a0 in "${array_0[@]}"
do
   for a1 in "${array_1[@]}"
   do
       mkdir -p "$HOME/web/$a0/$a1"
   done
done

Or, if you don’t mind avoiding the use of arrays but using expansion lists instead, this single command will do much the same thing:

mkdir -p ~/{one,two,three,four,five}/{x,y,z}

Leave a Reply

Your email address will not be published. Required fields are marked *