Для чего самым первым символом строки параметров getopts является: (двоеточие)?

Как насчет использования rsync или rsnapshot для резервного копирования локальной машины? После завершения проверки просто восстановите резервную копию.

http://rsnapshot.org/

http://www.mikerubel.org/computers/rsync_snapshots/

Аналогичным образом вы можете использовать LVM:

http://www.tldp.org /HOWTO/LVM-HOWTO/snapshots_backup.html

2
21.01.2019, 15:38
2 ответа

No -silencioso, getoptsimprime un mensaje de error:

$ bash -c 'getopts a opt' getopts_test -b
getopts_test: illegal option -- b

Silencio, getoptsno lo imprime solo:

$ bash -c 'getopts :a opt' getopts_test -b
$

Entonces, con los dos puntos para el modo silencioso, podemos imprimir nuestro propio error en el script tal como nos gusta, en lugar del mensaje fijo:

#!/bin/bash
while getopts :a opt; do
    [[ $opt = "?" ]] && echo "Invalid option character '$OPTARG'" >&2;
done
2
27.01.2020, 21:55

Si el primer carácter de optstringes dos puntos, getoptsno generará ningún mensaje de diagnóstico para argumentos de opciones faltantes u opciones no válidas.

Esto podría ser útil si realmente necesita tener más control sobre los mensajes de diagnóstico producidos por su secuencia de comandos o si simplemente no desea que aparezca nada en el flujo de error estándar si el usuario proporciona opciones de línea de comando inestables.

En el modo de informe silencioso (con la inicial :), si desea alertar al usuario de una opción no válida, deberá buscar ?en la variable pasada a getopts. Del mismo modo, para los argumentos de opción que faltan, es un :. Estos son los dos errores que generalmente maneja getopts, pero para hacer su propio informe de errores al usuario, deberá detectarlos por separado para poder dar el mensaje de diagnóstico correcto.

En el modo de informe no silencioso -, getoptshace su propio informe de errores en el error estándar y solo tiene que capturar un *para "cualquier error".

Compara estos dos ejemplos:

#!/bin/bash

while getopts 'a:b:' opt; do
    case "$opt" in
        a) printf 'Got a: "%s"\n' "$OPTARG" ;;
        b) printf 'Got b: "%s"\n' "$OPTARG" ;;
        *) echo 'some kind of error' >&2
           exit 1
    esac
done

El caso *detecta cualquier tipo de error de análisis de línea de comando .

$ bash script.sh -a
script.sh: option requires an argument -- a
some kind of error
$ bash script.sh -c
script.sh: illegal option -- c
some kind of error
#!/bin/bash

while getopts ':a:b:' opt; do
    case "$opt" in
        a)  printf 'Got a: "%s"\n' "$OPTARG" ;;
        b)  printf 'Got b: "%s"\n' "$OPTARG" ;;
        :)  echo 'missing argument!' >&2
            exit 1 ;;
        \?) echo 'invalid option!' >&2
            exit 1
    esac
done

El caso :anterior detecta errores de argumentos faltantes, mientras que el caso ?detecta errores de opciones no válidas (tenga en cuenta que ?debe escaparse o citarse para que coincida con un literal ?, ya que de lo contrario coincide con cualquier carácter único ).

$ bash script.sh -a
missing argument!
$ bash script.sh -b
missing argument!
$ bash script.sh -c
invalid option!
9
27.01.2020, 21:55

Теги

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