我遇到了这个shell脚本代码,它要求用户输入组号并找到该组号的最大值和平均值。 我的代码ATM仅适用于将组号作为命令行参数传递。如何提示组号作为用户输入?
read n
if [ $n -ge 1 ]; then
sum=0
count=$n
max=-1000
if [ $max -lt $1 ]; then
max=$1
fi
while [ $n -ge 1 ]; do
case $1 in
[0-9] | [1-9][0-9])
sum=`expr $sum +$1`;;
-[1-9] | -[1-9][0-9])
sum=`expr $sum + $1`;;
done
if [ $count -gt 0 ]; then
avg=`expr $sum / $count`
echo The largest number is $max
echo The average number is $avg
答案 0 :(得分:2)
从您的评论中,您似乎希望从stdin
而不是从命令行读取值。要在Bash中执行此操作,请使用read
内置:
read -ep "Enter group number: " group
printf "Entered %d\n" $group
对于交互式提示,它通常放在while
循环的测试部分中,如果输入无效,则可以中断:
shopt -s extglob
while read -ep "Enter group number: " group; do
case $group in
?(-)+([0-9])) # valid input
# compute average here
*) break ;; # not valid input
esac
done
有关详细信息,请参阅help read
。
答案 1 :(得分:0)
你的工作方式太难了,你的脚本太冗长了。尝试:
#!/bin/sh
test $# -gt 0 || { echo Please enter at least one argument >&2; exit 1; }
max=0
for x; do
test "$max" -lt $x && max=$x
test $? -gt 1 && exit 1
: $(( count += 1 ))
: $(( sum += x ))
done
echo max = $max
printf "avg = "
expr $sum / $count
由于您在脚本中使用了expr
,我也是这样做的,但请注意所有算法都将在整数中完成(因此报告的平均值将是小于实际值的最大整数平均值和非整数输入将被视为错误)。此解决方案依赖于test
在遇到错误时返回大于1的值(例如,非整数输入),这是由 the open group. 指定的行为
另请注意,这会将错误消息放在stderr
(错误消息所在的位置)并返回非零值以指示脚本失败。