[英]Shell script read user input
我被困在這個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
從您的評論看來,您似乎想從stdin
而不是從命令行讀取值。 要在Bash中執行此操作,請使用read
builtin:
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
你的工作方式太難了,你的腳本太冗長了。 嘗試:
#!/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的值,這是由open組指定的行為。
另請注意,這會將錯誤消息放在stderr
(錯誤消息所屬的位置)上,並返回非零值以指示腳本失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.