Я пытаюсь научиться использовать getopts, чтобы у меня могли быть сценарии с анализируемым вводом (хотя я думаю, что getopts мог бы быть лучше). Я пытаюсь просто написать простой скрипт, чтобы вернуть процент использования разделов. Проблема в том, что одной из моих функций bash, похоже, не нравится то, что я называю $1
переменной внутри функции. Я ссылаюсь на $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
bash
shell-script
scripting
Тимоти Пулиам
источник
источник
getopts
, не так ли? Ваш сценарий завершается из-за-u
перед вызовомgetopts
.Ответы:
set -u
будет прервана точно так, как вы описали, если вы ссылаетесь на переменную, которая не была установлена. Вы вызываете свой сценарий без аргументов, поэтомуget_percent
он вызывается без аргументов, что приводит$1
к невозможности его установки.Либо проверьте это перед вызовом вашей функции, либо используйте расширения по умолчанию (
${1-default}
расширится до,default
если еще не установлено что-то еще).источник
[ -n "${1-}" ]
(то есть с пустым значением по умолчанию), чтобы увидеть, установлен ли параметр и не является ли он пустым; или[ "${1+x}" = x ]
посмотреть, установлен ли он, даже если он пуст.if [[ -n ${1-default} ]]
Это эффект
set -u
.Вы можете проверить
$#
внутри функции и избежать ссылки,$1
если она не установлена.С помощью
$#
вы можете получить доступ к ряду параметров. В глобальном контексте это количество параметров для скрипта, в функции это количество параметров для функции.В контексте вопроса это
Обратите внимание, что вы должны использовать,
[ $# -ge 1 ] && [ -n "$1" ]
а не[ $# -ge 1 -a -n "$1" ]
, потому что это будет сначала оценить,$1
а затем проверить$#
.источник
Так как это
bash
вы можете обойти проверку на предмет$1
установки и просто использовать"$@"
($1
это первый параметр,$@
это все из них; при двойных кавычках он исчезает полностью, если у него нет значений, что позволяет избежать его захватаset -u
):Я также немного подправил остальную часть строки, чтобы вы не получили {пробел} {табуляцию} {пробел} между двумя значениями, которые вы выводите, но вместо этого вы получаете просто {табуляцию}. Если вы действительно хотите два невидимых пространства, измените их
awk
на использованиеprintf "%s \t %s\n", $1, $5
.источник
$@
для тебя краткое объяснение