2013-05-03 2 views
2

У меня есть данные, которые хранятся в одном из трех каталогов, и я хотел создать цикл, который позволит пользователю легко получить доступ к данным.Пользовательский ввод неверно читается в bash

Я пытаюсь заставить этот цикл работать так, чтобы, если кто-то входит в 1-3, он считывает число и меняет переменную timePeriod на «ежедневно», «bar10s» или «bar100ms». Когда я повторяю переменные timeCheck и timePeriod при запуске кода, чтобы убедиться, что они в порядке, timeCheck всегда возвращается вправо, но timePeriod читает «ежедневно» независимо от того, что читает переменная timeCheck. Я довольно новичок в bash, поэтому любая помощь будет оценена по достоинству.

#!/bin/bash 

echo 

timePeriod="" 
timeCheck=0 

read -p "Time Period for fac to run(press 1 for daily, 2 for 10 sec 
intervals, 3 for 100ms intervals): " -e -i "$timeCheck" timeCheck 

if [ $TimeCheck==1 ] ; then 
    timePeriod="daily" 
elif [ $TimeCheck==2 ] ; then 
    timePeriod="bars10s"  
elif [ $TimeCheck==3 ] ; then 
    timePeriod="bars100ms" 
else 
    echo "Not Valid Time Period. Please re-try." 
fi 


echo $timeCheck 
echo $timePeriod 

ответ

3

:

  1. Вам необходимо пространство в вашем предложении if
  2. Вы используете иногда шапки и somstimes не

работает следующая Вы можете использовать select - для таких меню.

PS3="Select what you want>" 
select answer in "Daily period" "10 sec period" "100 ms" "exit program" 
do 
case "$REPLY" in 
    1) timePeriod="daily" ; break;; 
    2) timePeriod="10s" ; break;; 
    3) timePeriod="100ms" ; break;; 
    4) exit ;; 
esac 
done 

echo "$timePeriod" 
+0

спасибо за помощь. help – Eric

+0

Еще раз спасибо за эту идею меню выбора. Он работает намного лучше, чем то, что я делал раньше. – Eric

+0

Я рад помочь. – jm666

2

Вам нужно положить пространства вокруг условий и логических операторов:

if [ $TimeCheck == 1 ] ; then 

Однако, поскольку он является арифметической тест, это может быть лучше делать:

if (($TimeCheck==1)) ; then 

пространства меньше важно с арифметическими проверками.

+0

если его bash поддерживает '[[..]]', я бы рекомендовал его использовать. – Kent

+0

Если '[[' поддерживается, вероятно, что '((поддерживается также, что предпочтительнее, если вы знаете, что вы делаете арифметику). – chepner

+0

@Kent: мое общее правило: use' [[..]] ' для сопоставления с образцом, '((..))' для арифметических сравнений и '[..]' только тогда, когда вы хотите играть в трюки. – cdarke

2

Я вижу две ошибки:

#!/bin/bash 

echo 

timePeriod="" 
timeCheck=0 

read -p "Time Period for fac to run(press 1 for daily, 2 for 10 sec 
intervals, 3 for 100ms intervals): " -e -i "$timeCheck" timeCheck 

if [ $timeCheck == 1 ] ; then 
    timePeriod="daily" 
elif [ $timeCheck == 2 ] ; then 
    timePeriod="bars10s" 
elif [ $timeCheck == 3 ] ; then 
    timePeriod="bars100ms" 
else 
    echo "Not Valid Time Period. Please re-try." 
fi 

echo $timeCheck 
echo $timePeriod 
+0

спасибо за помощь. – Eric

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