Bash getopts, обязательные аргументы

grep -w R /proc/[0-9]*/stat

PID может быть проанализирован из имен файлов.

Это также удобно для поиска процессов в состоянии D или Z.

2
22.11.2020, 19:46
1 ответ

Может быть, что-то вроде этого?

#!/bin/bash

unset host
unset port
unset user

while getopts h:p:u: opt; do
        case $opt in
                h) host=$OPTARG ;;
                p) port=$OPTARG ;;
                u) user=$OPTARG ;;
                *)
                        echo 'Error in command line parsing' >&2
                        exit 1
        esac
done

shift "$(( OPTIND - 1 ))"

if [ -z "$host" ] || [ -z "$user" ]; then
        echo 'Missing -h or -u' >&2
        exit 1
fi

# The rest of the script continues here and may make use of
# "$host" and "$user", and possibly "$port".

Основным битом здесь является короткий оператор ifв конце, который проверяет, было ли когда-либо назначено что-либо переменным hostили userв цикле while. Если какая-либо из этих переменных пуста, код рассматривает это как ошибку и завершает работу после вывода короткого диагностического сообщения.

Сценарий, показанный выше, также должен работать под /bin/sh, так как он не содержит башишмов.

Вместо оператора ifвы можете использовать

: ${host:?Missing -h}
: ${user:?Missing -u}

или, еще короче,

: ${host:?Missing -h} ${user:?Missing -u}

Команда :— это утилита, которая ничего не делает, но ее аргумент все равно будет обрабатываться вызывающей оболочкой, как и для всех команд. С двумя приведенными выше строками оболочка попытается расширить переменные hostи user, и если переменная не установлена ​​или если расширение приводит к пустой строке, тогда строка справа после ?будет быть выведены, и сценарий завершится с не -нулевым статусом выхода:

$ bash script.sh -h somehost
script.sh: line 21: user: Missing -u
$ echo $?
1

Расширение ${variable:?text}является стандартным и поэтому поддерживается bashи всеми другими оболочками, подобными POSIX sh-.

4
18.03.2021, 22:47

Теги

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