Зацикливание сценария Bash Shell - PullRequest
1 голос
/ 13 апреля 2011

Я довольно новичок в Linux, и я написал простой скрипт оболочки bash, который запрашивает у пользователя число, а затем запрашивает другое число и отображает сумму и произведение чисел. У меня нет проблем с этим, но я хочу зациклить сценарий.

Например, я хочу спросить пользователя, хотят ли они выйти, и если он решит не выходить, сценарий запускается заново и снова запрашивает два числа. Если есть кто-нибудь, кто знает что-то о петлях, не могли бы вы мне помочь, пожалуйста? Благодарю.

Вот мой код:

#!/bin/bash


echo -n "Name please? "
read name
echo "enter a number."
read number1
echo "enter another number"
read number2
echo "Thank you $name"
let i=0
let i=$number1+$number2
let x=0 
let x=$number1*$number2
echo "The sum of the two numbers is: $i"
echo "The product of the two numbers is: $x"
echo "Would you like to quit? Y/N? "
quit=N
while [ "$quit" = "Y" ]
do 
  clear  
  while ["$quit" != "Y" ]
  do
    echo "enter a number."
    read number1
    echo "enter another number"
    read number2
    echo "Thank you $name"
    let i=0
    let i=$number1+$number2
    let x=0 
    let x=$number1*$number2
    echo "The sum of the two numbers is: $i"
    echo "The product of the two numbers is: $x"
    echo "Would you like to quit? Y/N? "

Ответы [ 6 ]

3 голосов
/ 13 апреля 2011
#!/bin/bash

# Initialize quit so we enter the outer loop first time
quit="N"

# Loop while quit is N
while [ "$quit" = "N" ]
do
  echo -n "Name please? "
  read name
  echo "enter a number."
  read number1
  echo "enter another number"
  read number2
  echo "Thank you $name"
  let i=0
  let i=$number1+$number2
  let x=0 
  let x=$number1*$number2
  echo "The sum of the two numbers is: $i"
  echo "The product of the two numbers is: $x"

#reset quit - so we enter the inner loop first time
  quit="" 

#we want to repeat until quit is Y or N: 
#while quit is not "Y" and quit is not "N"
  while [ "$quit" != "Y" -a "$quit" != "N" ]
  do
    echo "Would you like to quit? Y/N?"
    read quit

#Convert lower case y/n to Y/N
    quit=`echo $quit | tr yn YN`
  done
done
2 голосов
/ 13 апреля 2011
while [[ "$(read -p "Quit?" q;echo $q)" != "y" ]] ; do
    echo okay, go on
done
0 голосов
/ 07 января 2013
#!/bin/sh
while true
do
 /var/www/bash/grep_ffmpeg.sh
 sleep 15
done

петля с nohup

0 голосов
/ 13 апреля 2011
#!/bin/bash
function sumAndProd {
    read -p "enter a number: " number1
    read -p "enter another number: " number2
    echo "Thank you $name"

    sum=$((number1+number2))
    prod=$((number1*$number2))

    echo "The sum of the two numbers is: $sum"
    echo "The product of the two numbers is: $prod"
}

read -p "Name please? " name

quit=N
while [[ "$quit" != Y ]]
do 
    sumAndProd
    read -p "Would you like to quit? Y/N? " quit  
done

Это больше обзор кода.

  • Главное, поместить повторяющуюся часть в функцию.
  • вместо i, x лучше использовать выразительные имена, возможно, сокращенно, как sum и prod.
  • если вы следуете за присваиванием (пусть a = 0) с присваиванием, без использования вашей переменной ранее, первое присваивание не имеет смысла.
  • Имя пользователя не изменится - нам нужно попросить об этом только один раз.
  • while (cond) ; do {block} done # является формой цикла.
  • Вы можете указать приглашение (-p) с чтением, поэтому оно будет заканчиваться одной строкой вместо двух.
  • сам по себе, вы не найдете let очень часто. Для арифметических выражений x = $ ((выражение)) встречается гораздо чаще.
  • Поскольку вы не используете повторно sum и prod, вам даже не нужна переменная. Всего echo The sum is $((number1+number2))
0 голосов
/ 13 апреля 2011

Самое простое, что нужно сделать - это зацикливаться вечно и прерываться, когда пользователь выходит:

while true
do
    read -p "Continue to loop? " answer
    [ "n" = "$answer" ] && break
done
echo "Now I'm here!"

Команда break выводит вас из текущего цикла и продолжает сразу после цикла. Нет необходимости в переменной flag .

Кстати:

[ "n" = "$answer" ] && break

То же, что и

if [ "n" = "$answer" ]
then
    break
fi

Обратите внимание на -p для приглашения в команде read. Таким образом, вы можете запросить и прочитать переменную одновременно. Вы также можете использовать \c в выражениях echo для подавления Новой строки или использовать printf, который не выполняет NL :

read -p "What do you want? " wants   #Prompt on the same line as the read

echo "What are your desires? \c"     #Prompt on the same line as the read
read desires

printf "What are your hopes? "       #Prompt on the same line as the read
read hopes

Надеюсь, это поможет.

0 голосов
/ 13 апреля 2011

Вот краткий пример циклов:

#!/bin/env bash
let quit="N"
while [ $quit != "Y" ]; do
    echo "To quit, enter Y:"
    read quit
done
...