#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 записать файл fi2. Не забудьте
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