16

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
29

There's a special syntax for this:

for i do
  echo "$i"
done

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

for i in "$@"; do
  echo "$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 echo "$i"; done
}
print_arguments 'hello world' '*' 'special   !\characters'    # prints 3 lines
print_arguments ''                                            # prints one empty line
print_arguments                                               # prints nothing
5
#! /usr/bin/env bash
for f in "$@"; do
  echo "$f"
done

You should quote $@ because it is possible for arguments to contain spaces (or newlines, etc.) if you quote them, or escape them with a \. For example:

./myscript one 'two three'

That's two arguments rather than three, due to the quotes. If you don't quote $@, those arguments will be broken up within the script.

  • 2
    There's a shorthand for this for f; do ... – glenn jackman Jun 13 '13 at 23:36

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.