LINUX.ORG.RU
решено ФорумAdmin

Как сделать подсказку для команды на bash

 ,


1

1

Нужно сделать строковым параметром проверки значений, только для bash

Есть команда, которая пишется ./команда.sh $значение $значение

Значения заменяются переменными в коде, которые задаются, когда пишется команда. Сам код не помню.

Но, когда пишу ./команда.sh и без значений или с не правильными, то скрипт всё равно выполняется.

Как поставить проверку в скрипт, чтобы было:
если значение пустое или не цифровое, тогда вылазит echo и правильный sintax, а скрипт не выполняется.

Подскажите, это как-то делается if else

Ответ на: комментарий от Korchevatel

Спасибо, разобрался с пустым. Мне подошло -n

Еще бы понять как указывать значение. Как-то так:

если переменная не = цифры от 1 до 1000 тогда echo «слишком много цифр»

Aeeioyqee ()
Ответ на: комментарий от Aeeioyqee

не = цифры от 1 до 1000 тогда echo «слишком много цифр»

#!/usr/bin/env bash

set -o errexit
set -o nounset
set -o pipefail

main() {
    local -i param="$1"

    if (( param > 1000 )); then
        echo "Too many digits"
        exit 1
    fi
}

main "$@"
./f.bash 1001
Too many digits
ubik ()
Последнее исправление: ubik (всего исправлений: 1)

Например, у меня в скриптах функция, которая разбирает вводимые аргументы:

arg_parse()
{	# arg_parse	21.04
  [ "$#" = '0' ] && usage && exit 0
  [ "$#" = '1' ] && case ${1} in
		  --version|-v)	echo "$(basename "$0") ${version}"; exit 0;;
		  *)	;;
		esac
  for i; do
	case ${i} in
	  --arch=*)	arch="${i#--arch=} ${arch}";;
	  --dest=*)	dest=${i#--dest=};;
	  -i=*)		icon=${i#-i=};;
	  --icon=*)	icon=${i#--icon=};;
	  -l=*)		lng=${i#-l=};;
	  --lng=*)	lng=${i#--lng=};;
	  --log)	msg='0'; msg_svc='log';;
	  --log=*)	msg=${i#--log=}; msg_svc='log';;
	  --notify)	msg='0'; msg_svc='notify';;
	  --notify=*)	msg=${i#--notify=}; msg_svc='notify';;
	  --speech)	msg='0'; msg_svc='speech';;
	  --speech=*)	msg=${i#--speech=}; msg_svc='speech';;
	  --src=*)	src=${i#--src=};;
	  --std)	msg='0'; msg_svc='std';;
	  --std=*)	msg=${i#--std=}; msg_svc='std';;
	  -u=*)		util=${i#-u=};;
	  --util=*)	util=${i#--util=};;
	  -v=*)		version=${i#-v=};;
	  --version=*)	version=${i#--version=};;
	  --)		;;
	  *)	if [ -n "${opt}" ]; then opt="${opt} ${i}"; else opt="${i}"; fi;;
	esac
done
}

Если запуск без аргументов, то вызов функции usage (в ней краткая справка) и завершение скрипта. Если один аргумент и этот аргумент «–version», то выводится версия. Дальше идет разбор переданных скрипту аргументов.

andytux ★★★★ ()
Ответ на: комментарий от ubik

Мне помог этот вариант. Здесь понятно и компактно.

Но в случае с несколькими значениями $1 и $2 скрипт ругается $1: unbound variable

Попробую завтра добавить в цикл. Чтобы получилось проверка двух значений на пустоту и на цифры.

Aeeioyqee ()
Ответ на: комментарий от Aeeioyqee

Если решать в лоб, в мою функцию в case добавить ветви:

[0-9][0-9][0-9]) echo "три цифры";;
[0-9][0-9]) echo "две цифры";;

Вместо echo добавь, что дальше с ними делать.

andytux ★★★★ ()
Ответ на: комментарий от andytux

Не могу в этом разобраться, мне это слишком сложно :/ дайте фул. Надо сразу.

[ "$#" = '0' ] && usage && exit 0 я так понял, это здесь проверка на аргументы. У меня не работает. Где указывается справка usage в скрипте?

Код у меня вот так выглядит:

 #!/bin/bash

if [ -n "$1" ]; then
  echo "не пусто1"
else
  echo "пусто1"
fi

if [ -n "$2" ]; then
  echo "не пусто2"
else
  echo "пусто2"
fi

Нужно настолько тупое решение.

Aeeioyqee ()
Последнее исправление: Aeeioyqee (всего исправлений: 2)
Ответ на: комментарий от Aeeioyqee

Ну нате «сразу фул».

#!/usr/bin/env bash

usage() {
        [[ $1 -eq 1 ]] && echo "Invalid parameter '$3'"
        [[ $1 -gt 1 ]] && echo "Too many args"
        echo "Usage: proga number"
        exit $2
} >&2

tst_args() {
        [[ $# -eq 0 ]] && usage 0 0
        [[ $# -gt 1 ]] && usage $# 2
        case "$1" in
        ''|*[^0-9]*) usage 1 2 "$1";;
        esac
        [[ $1 -lt 100 || $1 -gt 999 ]] && { echo "Bad number value, need 100-999"; exit 1; }
}

tst_args "$@"

vodz ★★★★★ ()

А не знаете, как сделать, чтобы подсказка была разными цветами? (lolcat не предлагайте)

Или это слишком уже?

Aeeioyqee ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.