Bash – How to Loop Through Arguments in a Bash Script

argumentsbashshell

I would like to write a bash script with unknown amount of arguments.

How can I walk through these arguments and do something with them?

A wrong attempt would look like this:

#!/bin/bash
for i in $args; do 
    echo $i
done

Best Answer

There's a special syntax for this:

for i do
  printf '%s\n' "$i"
done

More generally, the list of parameters of the current script or function is available through the special variable $@.

for i in "$@"; do
  printf '%s\n' "$i"
done

Note that you need the double quotes around $@, otherwise the parameters undergo wildcard expansion and field splitting. "$@" is magic: despite the double quotes, it expands into as many fields as there are parameters.

print_arguments () {
  for i in "$@"; do printf '%s\n' "$i"; done
}
print_arguments 'hello world' '*' 'special  !\characters' '-n' # prints 4 lines
print_arguments ''                                             # prints one empty line
print_arguments                                                # prints nothing