Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Shell script with parameters?

Tags:

bash

shell

sh

aix

I have a shell script that takes parameters, below is the code..

Right now it will only accept parameters if passed if called like this: script.sh --mode=load (or -m=load)

Is there a way to modify this so that it can be called with or without the "=" sign, so that I can call: script.sh --mode load (or -m load)

Ideally needs to work in pure bash as I don't have access to install additional tools, etc.

for i in "$@"
do
case $i in
 -m=*|--mode=*)
 MODE="${i#*=}"
  if [[ $MODE =~ ^(dump|load)$ ]]; then
   echo "" > /dev/null
  else
   bark "Invalid --mode set, set this to dump or load.";
   exit 1
  fi
 ;;
 -p=*|--db-path=*)
 DBPATH="${i#*=}"
 ;;
 -d=*|--dump-dir=*)
 DUMPDIR="${i#*=}"
 ;;
 -l=*|--list-file=*)
 TABLES="${i#*=}"
  # check if file exists on disk
  if [ -e $TABLES ]
  then
   echo "" >> /dev/null
  else
   bark "Table file not found!";
   exit 1
  fi
 ;;
 -t=*|--tenant-name=*)
 TENANT="${i#*=}"
  # check if tenant is correct
  if [[ $TENANT =~ ^($TENANT_LIST)$ ]]; then
   echo "" >> /dev/null
  else
   bark "Tenant name does not match, aborting.";
   exit 1
  fi
 ;;
 -s|--shared)
 SHARED=YES
 ;;
 *) usage # unknown option
 ;;
esac
done

My bash version:

bash --version

GNU bash, version 4.3.22(1)-release (powerpc-ibm-aix5.1.0.0)


1 Answers

Loop on $@. When $1 is "-m", do a shift. So in the next loop $1 will now be the argument to the -m option.

script.sh --mode load

# FIRST LOOP
$@ is "--mode load"
$1 is "--mode"   
shift

# SECOND LOOP
$@ is "load"
$1 is "load"

This is also useful if you can specify many arguments instead of just one like you have right now. Error checking should be done to validate your argument values, and if a user did script.sh --mode with no other argument.

like image 169
Nic3500 Avatar answered Jul 28 '26 15:07

Nic3500



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!