Как рассчитывается процент заряда батареи в Debian с i3?

Это вариант вашего скрипта:

#!/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
0
13.09.2020, 12:04
1 ответ

Может понадобиться:

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"```
0
18.03.2021, 23:05

Теги

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