Использование Echo, если они не задают правильные параметры

#bash

#bash

Вопрос:

У меня есть это

 USAGE="Usage: -f [file name] -c [column] -v [value] ."

while getopts ":f:c:v: " OPTIONS; do
    case $OPTIONS in
            f ) file=$OPTARG;;
            c ) column=$OPTARG;;
            v ) value=$OPTARG;;
            h ) echo $USAGE;;
            ? ) echo $USAGE
                     exit 1;;
            * ) echo $USAGE
                    exit 1;;
    esac
done
  

имя файла fun2.sh … Я хочу повторить использование $, если им не удастся ввести параметр в -f или -c или -v.

Я попытался ввести

 " ") echo $USAGE
exit1;;
  

но это не сработало..

Я также пытался

 if [ $file || $column || $value == "" ]
echo $USAGE 
  

но опять же это не сработало..

Любая помощь была бы оценена

Редактировать

Что сработало для меня

 if [ "$file" == "" ] ;
then
echo $USAGE
elif [ "$column" == "" ];
then
echo $USAGE
elif [ "$value" == "" ];
then
echo $USAGE
else
show_column
check_temp
file_move
write_file
  

Ответ №1:

Попробуйте:

 [[ -z "$file" || -z "$column" || -z "$value" ]] amp;amp; echo "$USAGE" amp;amp; exit
  

Ответ №2:

Вы не можете сделать это в цикле. Проверьте значения переменных после цикла и выведите $USAGE , если они пустые или значения неправильные (например, не целое число).

Комментарии:

1. я попробовал это, и это не сработало code , если [[ -n «$ file»]] ; затем echo $USAGE elif [[ -n «$ column»]] ; затем echo $USAGE elif [[ -n «$ value»]] ; затем echo $USAGE else показать столбец check_temp file_move записать файл fi

2. Не забудьте exit после echo .

3. @John -n тест выполняется, если строка не пуста, т. Е. вы выводите ошибку, если указан какой-либо из параметров, а не если какой-либо отсутствует. Используйте -z вместо этого, как в ответе @dogbane .

Ответ №3:

Не совсем уверен, почему ваш код не работает, но это должно:

 USAGE="Usage: -f [file name] -c [column] -v [value] ."

params="$(getopt -o f:c:v:h --name "$(basename -- "$0")" -- "$@")"

if [ $? -ne 0 ]
then
    echo "$USAGE"
    exit 1
fi

eval set -- "$params"

while true
do
    case $1 in
        -f)
            file="$2"
            shift 2
            ;;
        -c)
            column="$2"
            shift 2
            ;;
        -v)
            value="$2"
            shift 2
            ;;
        -h)
            echo "$USAGE"
            exit
            ;;
        --)
            shift
            break
            ;;
        *)
            echo "$USAGE"
            exit 1
            ;;
    esac
done
  

Комментарии:

1. Он также хочет распечатать использование, если «$ file» пуст или «-c» (т. Е. когда параметр отсутствует).

Ответ №4:

Джон, я не понимаю, что плохого в твоем коде: В моем bash появилось следующее: (название скрипта «go») — ОК, значит, получил то, что ожидал.

 jonatan:shell clt$ ./go
#ok

jonatan:shell clt$ ./go ewdwedw
#ok

jonatan:shell clt$ ./go -a
Usage: -f [file name] -c [column] -v [value] .
#ok, -a is incorrect

jonatan:shell clt$ ./go -f
Usage: -f [file name] -c [column] -v [value] .
#ok, -f need an argument

jonatan:shell clt$ ./go -f aaa
#ok, -f has an argiment

jonatan:shell clt$ ./go -c
Usage: -f [file name] -c [column] -v [value] .
jonatan:shell clt$ ./go -c -v
#hm -  "-v" comes into `column`, so syntactically is ok, but ....
  

Поэтому вам нужна еще одна проверка — как вы уже сделали. Итак, ваш скрипт в порядке.

Вот мой «ход».

 #!/bin/bash

USAGE="Usage: -f [file name] -c [column] -v [value] ."

while getopts ":f:c:v:" OPTIONS; do
    case "$OPTIONS" in
            f ) file=$OPTARG;;
            c ) column=$OPTARG;;
            v ) value=$OPTARG;;
            h ) echo $USAGE;;
            ? ) echo $USAGE; exit 1;;
            * ) echo $USAGE; exit 1;;
    esac
done