2015-04-29 2 views
0

Недавно я создал другой поток с вопросом о цикле for в сценарии bash, который я писал для своей курсовой работы в GCSE. У меня есть еще одна проблема с тем же сценарием bash (однако с тех пор он развился честно с момента последнего).If/Else statement issues в bash scripting

Вот код:

#!/bin/bash 
# A script that creates users. 

uerror='^[0-9]+$' 

echo "This is a script to create new users on this system." 
echo "How many users do you want to add? (in integer numbers)" 
read am 
echo " " 

if [[ $am =~ $uerror ]] ; then 

    echo "ERROR: Please use integer numbers." 
    echo "Please re-enter the amount." 
    read am ; 

else 

    echo " " 


    for i in $(seq "$am") 
    do 
     echo "Enter a username below:" 
     read usern 

     sudo useradd $usern 

     sudo passwd $usern 

     echo " " 
     echo "User $i '$usern' added." 

     echo " " 
     echo "What group do you want to add $usern to?" 
     read group 
     sudo usermod $usern -aG $group 

     echo "$usern added to $group" 
     echo " "  
     echo "-------------------" 
     echo " " 
done 
fi 

Проблема заключается в, если заявление. Цель состоит в том, чтобы запретить пользователям вводить ничего, кроме целого числа. Но по какой-то причине я, похоже, не могу захватить вход с части read am. Вместо этого сценарий проскакивает прямо в цикл for, где $(seq "$am"), очевидно, будет иметь проблемы с пониманием ввода, который не является числом.

Результат этой ошибки выглядит следующим образом.

seq: invalid floating point argument 

Однако, я не думаю, что это имеет отношение, потому что, насколько я могу судить, вопрос с, если/другое заявление.

Если бы кто-нибудь мог указать мне в правильном направлении, что мне нужно сделать, чтобы исправить это, я был бы очень благодарен.

Я также хотел бы повторить, что я все еще учась писать сценарии bash (а не особенно организованно), поэтому я, вероятно, допустил очень простую ошибку. Извиняюсь за это.

Thanks, Callum.

EDIT: Я ошибочно принял эхо-сообщение, теперь я изменил это, так что это на самом деле имеет смысл.

+0

Что запятой делать после того, как ваш, если? – Almo

+0

@Almo Быть правильным (если вы имеете в виду одно между ']]' и 'then'). –

+0

Просто проверки. Это было первое, что выскочило на меня, как странное. – Almo

ответ

1

Если вы хотите прочитать в ряде и убедитесь, что это число используется while цикл:

while read -p 'type a number:' n ; do 
    # Exit the loop if the input is a number 
    [[ "$n" =~ ^[0-9]+$ ]] && break 
    echo "This was not a number! Don't trick me!" 
done 

# Now can use `seq` 
seq "$n" 

if заявление в вашем примере будет делать на совершенно неправильные вещи. Он проверяет, является ли вход числом, а в - случай снова запрашивает ввод и выходит из сценария. Если вы не вводите номер, он использует (неправильный) вход в ветке else.

+0

Это работает блестяще! Спасибо. Я думаю, что сошел с ума, потому что теперь я оглядываюсь назад, обратная связь настолько очевидна! – CallumWale

+0

Добро пожаловать! Я рад, что могу помочь вам! :) – hek2mgl

0

Заменить весь файл с этим:

#!/bin/bash 
# A script that creates users. 

uerror='^[0-9]+$' 

echo "This is a script to create new users on this system." 
echo "How many users do you want to add? (in integer numbers)" 
read am 
echo " " 
while true; do 
if [[ $am =~ $uerror ]] ; then 

    break; 

else 
echo "Must be integer" 
echo "Please re-enter: " 
read am ; 
fi 
done 
    for i in $(seq "$am") 
    do 
     echo "Enter a username below:" 
     read usern 

     sudo useradd $usern 

     sudo passwd $usern 

     echo " " 
     echo "User $i '$usern' added." 

     echo " " 
     echo "What group do you want to add $usern to?" 
     read group 
     sudo usermod $usern -aG $group 

     echo "$usern added to $group" 
     echo " "  
     echo "-------------------" 
     echo " " 
done 
+1

Нет, это совсем не так. '==' использует сопоставление шаблонов, а не соответствие регулярных выражений.Также этот тип ответа не совсем полезен, поскольку он ничего не объясняет и содержит большое количество полностью несвязанного контента. –

+0

@EtanReisner, исправлен это. И если вы посмотрите на исходный код OP, вы обнаружите, что все это испортилось. Он проверяет целое число и вызывает его имя пользователя. Этот код не имеет никакого смысла. Я думаю, что необходимо было уточнить полный код – Jahid

+0

Да, я прокомментировал проблему с именем пользователя/счетчиком сообщения. Но здесь не вопрос. И в более широком смысле вы не упомянули эту проблему (или логическую проблему) в своем ответе. Вы просто сбросили кучу кода на OP. Это не полезно. –