2016-11-09 1 views
0

Я хочу проанализировать, является ли пользовательский ввод целым числом и заставить его сделать это. Первый раз (iquant) работает chkip() работает, второй раз (idays), я сразу же получаю: «Ошибка: не номер. Повторите попытку». Затем выполняется новый ввод. Я снимаю ipn до break, так что в чем дело?Исключительная переменная не работает

chkip() 
{ 
    ipn=$1 
    while true; 
    do 
     if [[ "$ipn" =~ ^[0-9]+$ ]] ; then 
      unset ipn 
      break 
     else 
      echo "Error: Not a number. Please retry" 
      read ipn 
     fi 
    done 
} 

echo "Please enter the name of the Set:" 
read ap 
echo "How much keys do you want to create [NUMBER]:" 
read iquant 
chkip $iquant 
echo "How often do you want to change the Keys? [DAYS] ?:" 
read idays 
chkip $idayz 
+0

Вы, вероятно, хотите процитировать эти разложения ('«$ 1»,' «$ iquant» ', и т.д.), а также рассмотреть' установить -u', чтобы получить сообщение об ошибке при попытке использовать отключенное переменную. –

+0

Возможно, вам также следует добавить возвращаемое значение, потому что после исправления 'iquant' будет содержать старое значение, а' ipn' будет недоступно. –

+0

Добро пожаловать в stackoverflow! +1 для включения полного, автономного исходного кода, ожидаемого результата и фактического результата. Это делает вопрос ясным, однозначным и легким для ответа и проверки. –

ответ

3

Проблема заключается в том, что вы читаете «IDAY сек», но прохождение «IDAY Z» вместо прежнего.

read idays 
chkip $idayz 

Изменение $ idayz в $ idays и вы будете на вашем пути.

+1

ах ... это больно ..... спасибо .... –

1

У вас есть большая проблема: ваша функция изменяет только переменную с именем ipn, а не любую переменную, значение вы передаете в качестве аргумента.

Эта функция принимает имя переменной и использует косвенное расширение параметра для проверки значения этой переменной. Значение из var передается в read как имя переменной для заполнения.

chkip() { 
    local var=$1 
    until [[ ${!var} =~ ^[[:digit:]]$ ]]; then 
    read -p "Error: Not a number. Please retry: " "$var" 
    done 
} 

Здесь имя, а не значение, переменной передается в качестве аргумента chkip.

read -p "Please enter the name of the set: " ap 
read -p "How many keys do you want to create? [NUMBER]: " iquant 
chkip iquant 
read -p "How often do you want to change the keys? [DAYS]: " idays 
chkip idays 

 Смежные вопросы

  • Нет связанных вопросов^_^