Выполнить параметр по умолчанию, если в getopts не указаны параметры

Параметр управляемое сохранение в virt-manager приостанавливает гостевую систему и выгружает ее память (и состояние процессора) в файл сохранения. Соответствующий start перезагружает гостя, чтобы он мог продолжить работу с того места, где он остановился.

Это работает с гостевыми системами на базе Linux, но я могу сказать, что опытным путем это не работает с гостевыми системами на базе Windows (они не перезапускаются успешно).

virsh managedsave {guest}
...
virsh start {guest}
4
02.06.2016, 15:52
5 ответов

Agregar una opción predeterminada a la declaración caseno ayudará porque no se ejecutará si getoptsno tiene opciones para analizar. Puede ver cuántas opciones procesó con la variable de shell OPTIND. dehelp getopts:

Each time it is invoked, getopts will place the next option in the
shell variable $name, initializing name if it does not exist, and
the index of the next argument to be processed into the shell
variable OPTIND.  OPTIND is initialized to 1 each time the shell or
a shell script is invoked.

Entonces, si OPTINDes 1, no se procesaron opciones. Agregue esto después de su bucle while:

if (( $OPTIND == 1 )); then
   echo "Default option"
fi
4
27.01.2020, 20:59

Utilice el bucle getoptspara establecer variables en función de los parámetros que se pasan. Luego actúe sobre estas variables:

#!/bin/sh

# Defaults:
do_help=0
do_r=0

while getopts "hr" opt; do
    case $opt in
        h) do_help=1 ;;
        r) do_r=1    ;;
        *) echo 'Error in command line parsing' >&2
           exit 1
    esac
done

if [ "$do_help" -eq 1 ]; then
    show_help
    exit
fi

printf 'Default option executed (r=%d)\n' "$do_r"

Opté por dejar que el código saliera correctamente si -hse usa (a menos que show_helpfalle )en lugar de que no -el estado de salida sea cero (pedir ayuda no es un error ).

Ejecutarlo:

$ sh script.sh -r
Default option executed (r=1)
$ sh script.sh
Default option executed (r=0)
$ sh script.sh -h
script.sh[24]: show_help: not found

Esto tiene la ventaja de separar el código de análisis de la línea de comando del resto de la lógica de su secuencia de comandos.

También le permite realizar verificaciones básicas de cordura después del ciclo mientras mantiene el ciclo de análisis breve y simple. Por ejemplo:

# command line parsing loop above here

if [ "$do_help" -eq 1 ] && [ "$do_r" -eq 1 ]; then
    echo 'Options -h and -r are mutually exclusive' >&2
    exit 1
fi

# code that acts on user-supplied options below
1
27.01.2020, 20:59

Вы также можете использовать количество аргументов :

if [ "$#" == 0 ]; then
  usage
  exit 1
fi

Подробнее здесь :http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST

1
27.01.2020, 20:59

FWIW, я нашел этот ответ StackOverFlow весьма полезным:

for i in "$@"; do
    case $i in
        -a=*|--a_param=*)
        PARAM_A="${i#*=}" ;
        -b=*|--b_param=*)
        PARAM_B="${i#*=}" ;;
        --default)
        DEFAULT=YES ;;
        *) echo "Unknown parameter passed: $i"; exit 1 ;;
    esac
done

echo PARAM_A = ${PARAM_A}
echo PARAM_B = ${PARAM_B}
echo DEFAULT = ${DEFAULT}

Для вызова скрипта без опции по умолчанию:

myscript.sh -a=my_a_param -b=my_b_param

должен напечатать:

PARAM_A = my_a_param
PARAM_B = my_b_param
DEFAULT =

И с установленным параметром по умолчанию:

myscript.sh -a=my_a_param -b=my_b_param --default

PARAM_A = my_a_param
PARAM_B = my_b_param
DEFAULT = YES

Впоследствии вы можете использовать DEFAULTсоответственно

0
08.05.2020, 19:22
DEF="Default command executed"
while getopts ":hr" opt;
   do case $opt in 
     h) show_help; 
        exit 1 ;; 
     r) echo "$DEF" ;; 
     *) echo "$DEF" ;; 
  esac
done

Чтобы getoptsобнаружил параметр, вам необходимо добавить :к каждому параметру, который вы хотите проверить.

0
11.09.2020, 13:22

Теги

Похожие вопросы