Сценарий оболочки с параметрами? - PullRequest
0 голосов
/ 08 июня 2018

У меня есть сценарий оболочки, который принимает параметры, ниже приведен код ..

В настоящее время он будет принимать параметры только в случае его передачи, если он вызывается следующим образом: script.sh --mode = load (или -m= load)

Есть ли способ изменить это так, чтобы его можно было вызывать со знаком или без знака "=", чтобы я мог вызвать: script.sh --mode load (или -m load)

В идеале нужно работать в чистом bash, поскольку у меня нет доступа для установки дополнительных инструментов и т. Д.

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

Моя версия bash:

bash --version

GNU bash, версия 4.3.22 (1) -релиз (powerpc-ibm-aix5.1.0.0)

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Не изобретайте велосипед.

Если у вас все в порядке только с 1 символами, используйте встроенную команду bash getopts

#!/bin/bash

while getopts :m:p:d:l:t:s opt; do
    case $opt in
        m) mode=$OPTARG ;;
        p) dbpath=$OPTARG ;;
        d) dumpdir=$OPTARG ;;
        l) tables=$OPTARG
           # test file existence
           ;;
        t) tenant=$OPTARG
           # test tenant
           ;;
        s) shared=YES ;;
        :) echo "Missing argument for option -$OPTARG" >&2 
           exit 2
           ;;
        *) echo "Invalid option -$OPTARG" >&2
           exit 2
           ;;
    esac
done
shift $((OPTIND - 1))

cat << SHOW_VARS
I have:
mode=$mode
dbpath=$dbpath
dumpdir=$dumpdir
tables=$tables
tenant=$tenant
shared=$shared
rest of args=$*
SHOW_VARS

В противном случае вы можетеиспользуйте внешнюю программу getopt, чтобы помочь разобрать ваши аргументы.У меня нет AIX-бокса для тестирования, поэтому YMMV

tempargs=$(
    getopt \
        -o m:d:l:t:s \
        --long mode:,db-path:,dump-dir:,list-file:,tenant-name:,shared \
        -- "$@"
)
if [[ $? -ne 0 ]]; then echo "Error..." >&2; exit 2; fi
eval set -- "$tempargs"

while true; do
    case $1 in
        -m|--mode) mode=$2; shift 2;;
        -p|--db-path) dbpath=$2; shift 2;;
        -d|--dump-dir) dumpdir=$2; shift 2;;
        -l|--list-file) tables=$2
           # test file existence
           shift 2
           ;;
        -t|--tenant-name) tenant=$2
           # test tenant
           shift 2
           ;;
        -s|--shared) shared=YES; shift;;
        --) shift; break ;;
        *) echo "Error..." >&2; exit 2 ;;
    esac
done
0 голосов
/ 08 июня 2018

Цикл на $ @.Когда $ 1 равен "-m", сделайте смену.Таким образом, в следующем цикле $ 1 теперь будет аргументом опции -m.

script.sh --mode load

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

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

Это также полезно, если вы можете указать много аргументов вместо одного, как у вас сейчас.Проверка ошибок должна быть сделана для проверки значений вашего аргумента, и если пользователь сделал script.sh --mode без другого аргумента.

...