≡ Menu

Shell scripting and brace expansion

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 host1.my.com,host2.my.com,…host10.my.com then I can use brace expansion at shell prompt as follows:

$ echo host{1..5}.my.com
host1.my.com host2.my.com host3.my.com host4.my.com host5.my.com

Now try it in a shell script:

#!/bin/bash
HOSTS="$1"
for i in $HOSTS
do
ping $i
# rest of logic
done

And then executed script by typing command:

$ ./myscript host{1..5}.my.com 

It will not expand to host1.my.com, host2.my.com….. :/? 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 ;)

Share this on:

Your support makes a big difference:
I have a small favor to ask. More people are reading the nixCraft. Many of you block advertising which is your right, and advertising revenues are not sufficient to cover my operating costs. So you can see why I need to ask for your help. The nixCraft, takes a lot of my time and hard work to produce. If you use nixCraft, who likes it, helps me with donations:
Become a Supporter →    Make a contribution via Paypal/Bitcoin →   

Don't Miss Any Linux and Unix Tips

Get nixCraft in your inbox. It's free:



{ 2 comments… add one }
  • riscphree December 18, 2005, 3:10 pm

    albeit simple, thats pretty sweet. I didnt know how to do that :D

  • abhishek March 7, 2013, 5:54 am

    I am trying to understand a shell script demo1.sh
    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 demo1.sh *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?

Leave a Comment