Это вариант вашего скрипта:
#!/bin/bash
opt_l=8 # password length is 8 by default
opt_o=/dev/stdout # write to standard output by default
opt_s=0 # insecure password by default
opt_u= # no default username
while getopts 'l:o:su:' opt; do
case "$opt" in
l) opt_l=$OPTARG ;;
o) opt_o=$OPTARG ;;
s) opt_s=1 ;;
u) opt_u=$OPTARG ;;
*) echo 'Error parsing options' >&2
exit 1
esac
done
args=( "$opt_l" 1 )
if (( opt_s )); then
args=( -s "${args[@]}" )
fi
if [ -n "$opt_u" ]; then
printf '%s: %s\n' "$opt_u" "$( pwgen "${args[@]}" )" >"$opt_o"
else
pwgen "${args[@]}" >"$opt_o"
fi
Я изменил названия некоторых флагов, чтобы они больше соответствовали тому, что используют стандартные инструменты. Вместо того, чтобы печатать сообщение об ошибке при обнаружении неподдерживаемого флага, вы можете вывести пользователю некоторую информацию об использовании.
Главное здесь использование getopts
. Он принимает спецификацию в виде строки параметров, которые вы используете. :
в строке означает, что предыдущий символ опции принимает аргумент (другие опции являются логическими ).
В цикле while
$opt
будет опцией, а $OPTARG
будет аргументом опции, если флаг принимает аргумент.
Обычно также выполняется shift "$(( OPTIND - 1 ))"
после цикла, но поскольку этот скрипт не принимает дополнительные операнды в командной строке, кроме опций и их аргументов, в этом нет необходимости. shift
гарантирует, что дополнительные операнды будут доступны как $1
, $2
и т. д.
Вы можете использовать скрипт как
$./script.sh -l 4 # generates password of length 4 in the terminal
$./script.sh -l 4 -o file # generates password of length 4 and saves to "file"
$./script.sh -u bob # generates password of length 8, prepends with username "bob"
$./script.sh -s -u bob # generates more random password of length 8, prepends with username "bob"
-s -u bob
совпадает с -ubob -s
и -subob
, а поскольку-u alice -s -u bob
(более поздние параметры переопределяют более ранние ).
Было бы довольно легко удалить pwgen
из этого и просто использовать другой генератор паролей. Чтобы упростить это, можно поместить генератор паролей в отдельную функцию, что означает, что основной скрипт никогда не будет изменяться при замене генератора :
#!/bin/bash
passgen () {
local args=( "$opt_l" 1 )
if (( opt_s )); then
args=( -s "${args[@]}" )
fi
pwgen "${args[@]}"
}
opt_l=8 # password length is 8 by default
opt_o=/dev/stdout # write to standard output by default
opt_s=0 # insecure password by default
opt_u= # no default username
while getopts 'l:o:su:' opt; do
case "$opt" in
l) opt_l=$OPTARG ;;
o) opt_o=$OPTARG ;;
s) opt_s=1 ;;
u) opt_u=$OPTARG ;;
*) echo 'Error parsing options' >&2
exit 1
esac
done
if [ -n "$opt_u" ]; then
printf '%s: %s\n' "$opt_u" "$( passgen )" >"$opt_o"
else
passgen >"$opt_o"
fi
Например, это примерно ваш генератор:
passgen () {
local source=/dev/urandom
local chars='A-Za-z0-9'
if (( opt_s )); then
chars="$chars"'.-@'
fi
tr -dc "$chars" <"$source" | head -c "$opt_l"
}
... и следующее генерирует фразу-пароль, используя слова из/usr/share/dict/words
(количество слов берется из опции -l
). Если используется опция -s
,он добавляет случайное число в конец вместо последнего слова.
passgen () {
local dict=/usr/share/dict/words
local numwords=$opt_l
if (( opt_s )); then
numwords=$(( numwords - 1 ))
fi
{
shuf -n "$numwords" "$dict"
if (( opt_s )); then
printf '%d\n' "$RANDOM"
fi
} | tr '\n' ' ' | sed 's/ $//'
}
Работа с этой последней функцией passgen
, команда
./script.sh -s -u bob -l 3
может генерировать что-то вроде
bob: cassis befluster 22625
Может понадобиться:
cd /proc/acpi/battery/BAT0;
max=$(grep 'design capacity:' info|awk '{print $3}')
current=$(grep 'remaining capacity:' state|awk '{print $3}')
percent=$(expr $current"00" / $max )
echo -e "Current capacity: \t$current"
echo -e "Max capacity: \t$max"
echo -e "Percent: \t\t$percent"```