2016-04-07 4 views
1

Я пытаюсь сделать цикл while. Этот цикл должен либо повторять «повторить попытку», либо ввести «exit to quit» при наборе таблеток или пальцевого пользователя, если вы набрали имя пользователя.Bash while loop

echo Please enter a user name to find. 
read username 
done_fn() 
{ 
    finger $username 
    exit 0 
}  
continue_fn() 
{ 
    echo 'try again or type exit to quit' 
    read exitvar 
} 

grep $username /etc/passwd >/dev/null 
while [ $? -eq 0 ] 
do 
    done_fn 
done 

exitvar=quit 

until [ $exitvar = exit ] 
do 
    continue_fn 
    done 
while [ -u $exitvar ] 
do 
    done_fn 
done 

Это все, что у меня есть. Всякий раз, когда я набираю имя пользователя после того, как «повторите попытку или введите exit to quit», он просто повторит его снова. Я бы хотел, чтобы он пальцем пользователя, а не повторять его снова. Я смотрел во многих местах и ​​не могу найти ответ.

Заранее спасибо.

+0

Можете ли вы поделиться результатами, которые получаете? Чтобы показать неправильное поведение? –

+1

Научитесь использовать функцию отладки/трассировки оболочки и проблемные линии окружения с отключением 'set -vx' и' set + vx'. Вы увидите, что ваш код отображается, а затем выполнен. Строки с + на передней панели показывают, какие значения были заменены именами переменных. В режиме отладки все цитирование «отключено» функцией отладки/трассировки для одиночного кавычки. Вы должны сразу увидеть, что ваша проблема с 'grep', за которой следует' while'. Удачи! – shellter

+0

Как только я запустил его и набрал правильного пользователя, он пальцы пользователя. если я набираю тарабарщину, он выдает «попробуйте еще раз или введите exit to quit», и как только я попытаюсь ввести правильного пользователя, он продолжит вывод: «попробуйте еще раз или введите exit для выхода». username_loop.sh Введите имя пользователя для поиска. jmalley2 Логин: jmalley2 Имя: Joseph Malley username_loop.sh Введите имя пользователя, чтобы его найти. asdfasdfasfasf попытку или тип выхода бросить jmalley2 попробовать еще раз или тип выхода бросить –

ответ

1

Вы можете попробовать это:

typeset u="John Doe" 
while ! grep -q "^$u:" /etc/passwd 
do 
    echo -n "username? " 
    read u 
    if [[ $u = "q" ]] 
    then 
      exit 
    fi 
done 
finger $u 
+0

Вы начинаете с имени, которое вы наверняка не найдете в/etc/passwd. Затем, пока вы не найдете введенное имя в первом поле/etc/passwd (^ :), вы продолжаете задавать новые имена. Если вы, наконец, найдете имя, просто перенесите его. – Dandorid

+0

Вы можете поместить 'read' в' while', так что вам не нужно начинать с заданного значения. Также я думаю, что «палец» должен идти внутри цикла. – tripleee

+0

Петля используется для поиска действительного имени пользователя, и ничего более. Если имя пользователя равно «q», то выйдите полностью. Если действительное имя пользователя найдено, выполните окончательный оператор «finger», а затем завершите выполнение сценария. 'Read' уже находится в' while', и палец не будет там, так как это не в исходном запросе. – Dandorid

0
echo Please enter a user name to find. 
read username 
donev2_fn() 
{ 
     finger $exitvar 
     exit 0 
} 
done_fn() 
{ 
     finger $username 
     exit 0 
} 
continue_fn() 
{ 
     echo 'try again or type exit to quit' 
     read exitvar 
     grep $exitvar /etc/passwd >/dev/null 
     if [ $? -eq 0 ] 
       then 
         donev2_fn 
     fi 
} 
grep $username /etc/passwd >/dev/null 
while [ $? -eq 0 ] 
     do 
       done_fn 
done 
exitvar=quit 
until [ $exitvar = exit ] 
     do 
       continue_fn 
done 

Я понял это. Я должен был добавить в него дополнительную функцию. Спасибо вам за помощь.