We're using a while loop that runs a read command each time. The read command uses the -d '' option to specify the delimiter and it interprets the empty string as a NUL byte (\0) (as Bash arguments can not contain NULs). This means that instead of reading a line at a time (up to a newline), we're reading up to a NUL byte. Unlike in bash, awk requires us to specify as aspects of the loop we are performing. We must specify a variable to index the loop, in this case ‘field’, and we start with field=1 and continue until field<=NF that is until it is greater than NF, the number of fields in the line.
At the same time, bash parses command lines into “words” based on non-quoted whitespace. The cd command typically requires exactly one argument (the destination directory). A command line like cd foo bar means to run cd with two arguments: foo and bar. If you only wanted to send a single foo bar argument, then you need to quote the space: