Я создал сценарий bash на моем Mac с именем Armstrong.sh
.Контур неожиданно бежит бесконечно в сценарии Bash
Это функция, которая проверяет число, которое является номером armstrong.
# This function works properly
armstrong() {
num=$1 # Making a copy of the received number.
sum=0 # This will store the sum of cubes of each digit from $num
while [ $num -gt 0]; # This loop runs while $num is greater than 0
do
temp=`expr $num % 10` # Extract the last digit of the number
sum=`expr $sum + $temp \* $temp \* $temp` # Cube the last digit and add it to $sum
num=`expr $num/10` # Remove the last digit of the number
done
if [ $sum -eq $1 ]; # If $sum == $1, i.e., If the number is armstrong
then
echo "$1 is an armstrong number" # print the number
else
echo "$1 is not an armstrong number"
fi
}
Когда я пишу следующий код,
armstrong 1 # this is an armstrong number
armstrong 153 # This is an armstrong number
armstrong 24 # This is not an armstrong number
Тогда это выход следующим образом,
1 is an armstrong number
153 is an armstrong number
24 is not an armstrong number
Это было хорошо до сих пор.
Но ПРОБЛЕМА находится здесь.
Когда я пытаюсь напечатать все номера Армстронгом в диапазоне с помощью цикла, как это:
# Accept start and end point of the range
echo -n "Enter start = "
read start
echo -n "Enter end = "
read end
# Loop from start to end point and call the armstrong() function
for ((num = $start; num <= $end; num++))
do
armstrong $num # Calling the function.
done
Так что мои вопросы:
1> Как получить цикл работы в качестве желаемого?
2> Есть ли способ написать код, не используя $temp
в armstrong()
функция?
Как sum += Math.pow(num%10, 3);
в Java?
3> Пожалуйста, дайте мне более чистый способ написать функцию armstrong
.
BTW , поскольку вы нацеливаетесь на bash, подумайте об использовании математических контекстов больше - 'if ((sum == $ 1))' немного легче читать, чем 'if [" $ sum "-eq" $ 1 "]'. –
... также современный синтаксис POSIX sh: 'temp = $ ((num% 10))' и 'sum = $ ((sum + temp * $ temp * $ temp))'; нет необходимости использовать 'expr' для математики, если таргетинг на pre-POSIX Bourne (что почти неслыханно в наши дни). –
Рассмотрите возможность использования http://shellcheck.net/ для статического анализа ваших сценариев оболочки, кстати. –