Shell scripting and brace expansion

Posted on in Categories News last updated December 18, 2005

Expansion is performed on the command line after it has been split into words. Brace expansion is a mechanism by which arbitrary strings may be generated. A sequence expression takes the form {x..y}, where x and y are either integers or single characters. Simple bash brace expansion example:

$ echo F{1,2,3,4,5}
F1 F2 F3 F4 F5

It works with almost any command:

$ mkdir -p /home/project/{sales,purchase,reports}

It is funny but some time you can stuck in shell scripting very badly and you do not understand what is going on … For example I need to expand hostnames using,,… then I can use brace expansion at shell prompt as follows:

$ echo host{1..5}

Now try it in a shell script:

for i in $HOSTS
ping $i
# rest of logic

And then executed script by typing command:

$ ./myscript host{1..5} 

It will not expand to,….. :/? It took me more than two hours, finally while chatting with my friend he told me to replace HOSTS=”$1″ with HOSTS=”$@”. Bingo it worked!
According to bash man page,”A sequence expression takes the form {x..y}, where x and y are either integers or single characters. When integers are supplied, the expression expands to each number between x and y, inclusive. When characters are supplied, the expression expands to each character lexicographically between x and y, inclusive. Note that both x and y must be of the same type”. $@ is a special shell variable which. expands to the positional parameters, starting from one. When the expansion occurs within double quotes, each parameter expands to a separate word. I must admit I need to master shell shell scripting skills 😉

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin, DevOps engineer, and a trainer for the Linux operating system/Unix shell scripting. Get the latest tutorials on SysAdmin, Linux/Unix and open source topics via RSS/XML feed or weekly email newsletter.

Share this on (or read 2 comments/add one below):

2 comment

  1. I am trying to understand a shell script
    this is used to count the number of files in a directory

    declare -a args=( “$@” )
    echo ${#args[@]} # count the elements of the array args

    bash *pdf will give you the correct number of pdf files.

    Can you explain how does this work or how is it getting expanded specially in first line
    (“$@”) why the bracket () is used here and in second line args[@] what does this gets expanded to?

    Have a question? Post it on our forum!