我这周刚开始在 UNIX 上编程,我的家庭作业任务之一是创建一个脚本,该脚本读取正数直到输入 -99,负数显示错误(0 到 -98)。这是我想到的,但有点卡住了。谢谢 :)
#!/bin/bash
COUNTER=1
echo "Enter a positive integer number (-99 to quit):"
read NUMBER
echo "$NUMBER: "
while [ $NUMBER -ge $COUNTER ]; do
echo $COUNTER
((COUNTER++))
done
答案1
#!/bin/bash
while true; do
read -p 'Number (-99 to quit): '
if ! [[ "$REPLY" =~ ^-?[0-9]+$ ]]; then echo 'Error: Not an integer' >&2
elif (( REPLY == -99 )); then break
elif (( REPLY <= 0 )); then echo 'Error: Need positive integers >0' >&2
else
printf 'Got "%d", that is number %d\n' "$REPLY" "$(( ++c ))"
fi
done
这是一个无限循环,当用户输入时退出-99
。任何正整数响应都会提示代码说明Got "some number"
目前为止读取了多少个有效数字,而负整数、零或非数字输入将给出有关标准错误的诊断消息。如果没有给出任何其他变量名称,代码使用的变量REPLY
是写入的变量。read
正确数字输入的测试是通过将响应与正则表达式进行匹配来完成的^-?[0-9]+$
。这个表达式将匹配如果响应采用我们期望的形式(可选的破折号后跟至少一位数字)。如果不匹配,则会在标准错误上发出诊断消息。
直到第一个elif
我们都不能确定它$REPLY
是一个整数。之后,我们用于(( ... ))
比较的算术评估。
的测试-99
需要在负整数的测试之前进行,否则我们将无法退出循环。
答案2
如果我理解正确的话,这应该有效:
#! /bin/bash -
read -p "Enter a positive integer (-99 to quit): " USR_INT
while [[ -n "$USR_INT" ]]; do
case "$USR_INT" in
-99)
echo "Exiting..."
exit 0
;;
-*)
echo "Error, please enter a positive integer."
exit 1
;;
0)
echo "Error, please enter a positive integer."
exit 1
;;
[0-9]*)
echo "You have entered $USR_INT"
;;
*)
echo "Error, please enter a positive integer."
exit 1
;;
esac
read -p "Enter a positive integer (-99 to quit): " USR_INT
done
答案3
保持简单:
!/bin/bash
while :
do
echo "Enter a positive integer number (-99 to quit):"
read NUMBER
if (( NUMBER == -99 ))
then
exit
fi
echo "$NUMBER: "
COUNTER=1
while (( COUNTER <= NUMBER ))
do
echo $COUNTER
((COUNTER++))
done
done