grep -w R /proc/[0-9]*/stat
PID может быть проанализирован из имен файлов.
Это также удобно для поиска процессов в состоянии D или Z.
Может быть, что-то вроде этого?
#!/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
-.