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 😉
🐧 Get the latest tutorials on Linux, Open Source & DevOps via:
- RSS feed or Weekly email newsletter
- Share on Twitter • Facebook • 2 comments... add one ↓
Category | List of Unix and Linux commands |
---|---|
File Management | cat |
Firewall | Alpine Awall • CentOS 8 • OpenSUSE • RHEL 8 • Ubuntu 16.04 • Ubuntu 18.04 • Ubuntu 20.04 |
Network Utilities | dig • host • ip • nmap |
OpenVPN | CentOS 7 • CentOS 8 • Debian 10 • Debian 8/9 • Ubuntu 18.04 • Ubuntu 20.04 |
Package Manager | apk • apt |
Processes Management | bg • chroot • cron • disown • fg • jobs • killall • kill • pidof • pstree • pwdx • time |
Searching | grep • whereis • which |
User Information | groups • id • lastcomm • last • lid/libuser-lid • logname • members • users • whoami • who • w |
WireGuard VPN | Alpine • CentOS 8 • Debian 10 • Firewall • Ubuntu 20.04 |
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?
albeit simple, thats pretty sweet. I didnt know how to do that 😀