DEV Community

Aastha Shrivastava
Aastha Shrivastava

Posted on

Taking command line arguments using flags in bash

In the previous article we created a simple bash script let's modify it a bit to accept command line arguments.
We will accept the name of directory which needs to be created and the path of directory whose files we have to list.
We will use flags to take input i.e -i for name of input directory whose contents will be listed and -o for output directory.

This is our current code:

#!/usr/bin/bash
# Script to create a directory in home with given name and a file containing list of files present in /var/www/html
NAME="Aastha"
mkdir ~/$NAME
echo `ls /var/www/html` > ~/$NAME/file_list.txt
Enter fullscreen mode Exit fullscreen mode

Getting arguments using getopts

We will use get getopts function which returns a list of options(flags) with respective argument.
We will use a while to iterate through getopts

while getopts i:o: flag 
do
Enter fullscreen mode Exit fullscreen mode

Here are we are specifying list of valid options as i:o: the : represents that an option need to be followed by a value.You can read more about getopts here.
flag is the iterator variable here. In bash the do followed by while statement specifies starting of block which contains satement to be executed by while. The ending of block is specified by done.

Storing argument values in variables

We will use switch case to assign values, based on options.

case "${flag}" in
                i) infolder=${OPTARG}
                        ;;
                o) outfolder=${OPTARG}
                         ;;
                *) echo "Invalid option: -$flag" ;;
        esac
done
Enter fullscreen mode Exit fullscreen mode

The above will comapare $flag with i,o and * where * can be any thing other than i and o. The ;; indicates the end of a case. The ${OPTARG} contains the argument supplied for $flag option.
The esac indicates the end of the whole switch case block.

Replacing hard-coded values with new variables

mkdir ~/$outfolder 
ls $infolder > ~/$outfolder/file_list.txt
Enter fullscreen mode Exit fullscreen mode

Final code

#!/usr/bin/bash
# Script to create a directory in home with name `$outfolder` and a file containing list of files present in`$infolder`
while getopts i:o: flag

do
        case "${flag}" in
                i) infolder=${OPTARG}
                        ;;
                o) outfolder=${OPTARG}
                         ;;
                *) echo "Invalid option: -$flag" ;;
        esac
done
mkdir ~/$outfolder 
ls $infolder > ~/$outfolder/file_list.txt
Enter fullscreen mode Exit fullscreen mode

Top comments (0)