Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Check that there are at least two arguments given in a bash script

Tags:

linux

bash

I am trying to write a script that mimics cp where there is a source and destination input. how can I count the number of arguments given on the command line

for example

./myscript src dest

check that at least 2 things were given.

like image 895
BillPull Avatar asked Nov 03 '11 01:11

BillPull


People also ask

How do you check the number of arguments in bash?

The $# special variable will let you find out the total number of arguments passed to any Bash script very easily.

What is && and || in shell script?

The operators "&&" and "||" shall have equal precedence and shall be evaluated with left associativity. For example, both of the following commands write solely bar to standard output: $ false && echo foo || echo bar $ true || echo foo && echo bar.

What does [- Z $1 mean in bash?

$1 means an input argument and -z means non-defined or empty. You're testing whether an input argument to the script was defined when running the script.

What does && do in bash?

"&&" is used to chain commands together, such that the next command is run if and only if the preceding command exited without errors (or, more accurately, exits with a return code of 0).


2 Answers

Use the $# special variable. Its value is the number of arguments. So if you have a script that contains only:

echo $# 

and execute it like this:

thatscript foo bar baz quux 

It'll print 4.

In your case you may want to do something like:

if [ $# -lt 2 ]; then     # TODO: print usage     exit 1 fi 
like image 109
Laurence Gonsalves Avatar answered Oct 05 '22 14:10

Laurence Gonsalves


Going by the requirement from the question that the arguments should contain "at least 2 things", I think it might be more accurate to check:

if (( $# < 2 )); then     # TODO: print usage     exit 1 fi 

Using arithmetic expansion (( )) will prevent this from hitting exit 1 for any value not equal to 2.

If you use if [ $# -ne 2 ]; it will trigger the conditional for any number of arguments other than 2.

Edit: It looks like the accepted answer has been updated to include an equivalent (and more portable?) example of this.

like image 44
Andrew Avatar answered Oct 05 '22 16:10

Andrew