Intereting Posts
Как включить два сетевых интерфейса как для Интернета в ubuntu12.04 Должен ли я помещать заявку в / usr / local или / usr / local / share? Что случилось с книгами о программировании драйверов устройств Linux за последние восемь лет? git-upload-pack висит бесконечно Создавайте случайные данные с помощью dd и получайте «предупреждение частичного чтения». Являются ли данные после предупреждения сейчас действительно случайными? Проверьте веб-каталог, если существует файл, если не выходить Как я могу улучшить скорость попадания кеша nscd? отремонтировать статический маршрут, чтобы трафик был в нужном месте sudo и sssd не работают с группами пользователей Вывод gzip трубы для передачи Bluetooth? Получение исходного вызова команды из / proc / self Предотвратите кражу фокуса в Awesome WM, особенно из Skype Java-программы воруют фокус в X11 Установите последнюю версию пакета, для которого не требуется обновление зависимостей Как перезапустить firefox из командной строки?

Ошибка бросков Bash, строка 8: $ 1: несвязанная переменная

Я пытаюсь научиться использовать getopts, чтобы у меня могли быть скрипты с анализируемым вводом (хотя я думаю, что getopts мог бы быть лучше). Я пытаюсь просто написать простой скрипт, чтобы вернуть процент использования разделов. Проблема в том, что одной из моих функций bash, похоже, не нравится, что я ссылаюсь на $1 как на переменную внутри функции. Причина, по которой я get_percent $1 заключается в том, что функции get_percent можно передать точку монтирования в качестве необязательного аргумента для отображения вместо всех точек монтирования.

Сценарий

 #!/usr/bin/bash set -e set -u set -o pipefail get_percent(){ if [ -n "$1" ] then df -h $1 | tail -n +2 | awk '{ print $1,"\t",$5 }' else df -h | tail -n +2 | awk '{ print $1,"\t",$5 }' fi } usage(){ echo "script usage: $(basename $0) [-h] [-p] [-m mount_point]" >&2 } # If the user doesn't supply any arguments, we run the script as normal if [ $# -eq 0 ]; then get_percent exit 0 fi # ... 

Выход

 $ bash thing.sh thing.sh: line 8: $1: unbound variable $ bash -x thing.sh + set -e + set -u + set -o pipefail + '[' 0 -eq 0 ']' + get_percent thing.sh: line 8: $1: unbound variable 

set -u будет прервана точно так, как вы описываете, если вы ссылаетесь на переменную, которая не была установлена. Вы вызываете ваш скрипт без аргументов, поэтому get_percent вызывается без аргументов, в результате чего $1 будет сброшен.

Либо проверьте это перед вызовом вашей функции, либо используйте расширения по умолчанию ( ${1-default} будет расширяться до default по default если оно еще не установлено на что-то другое).

Это эффект set -u .

Вы можете проверить $# внутри функции и избежать обращения к $1 если она не установлена.

Поскольку это bash вы можете обойти проверку установленного $1 и просто использовать "$@" (при двойных кавычках этот параметр полностью исчезает, если у него нет значений, что позволяет избежать его захвата с помощью set -u ):

 get_percent() { df -h "$@" | awk 'NR>1 { printf "%s\t%s\n", $1, $5 }' } 

Я также немного подправил остальную часть строки, чтобы вы не получили {пробел} {табуляцию} {пробел} между двумя значениями, которые вы выводите, но вместо этого вы получаете просто {табуляцию}. Если вам действительно нужны два невидимых пробела, измените awk на printf "%s \t %s\n", $1, $5 .