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.
The $# special variable will let you find out the total number of arguments passed to any Bash script very easily.
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.
$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.
"&&" 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).
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With