Linux 设置变量以供以后在案例构造中使用
我有一个实践问题,那就是要求我使用我现有的代码,并将字母等级的变量插入现有的“IF”语句中,以用于基于指定字母等级读取句子的case构造。我遇到的问题是如何首先设置变量,也就是说,我是否需要为变量设置一条全新的IF/ECHO线路?一开始我该怎么说呢 会不会是A级 以下是我到目前为止所做的:(编辑以包含建议)Linux 设置变量以供以后在案例构造中使用,linux,bash,shell,conditional,Linux,Bash,Shell,Conditional,我有一个实践问题,那就是要求我使用我现有的代码,并将字母等级的变量插入现有的“IF”语句中,以用于基于指定字母等级读取句子的case构造。我遇到的问题是如何首先设置变量,也就是说,我是否需要为变量设置一条全新的IF/ECHO线路?一开始我该怎么说呢 会不会是A级 以下是我到目前为止所做的:(编辑以包含建议) 正如你所说,这项任务没有多大意义。。。。如果我们的等级和等级数量是完全可变的,这是有道理的。但是,这是一个练习问题,所以他们可能会要求你做一些废话,只是为了练习 因为这是一个练习,我会给你一
正如你所说,这项任务没有多大意义。。。。如果我们的等级和等级数量是完全可变的,这是有道理的。但是,这是一个练习问题,所以他们可能会要求你做一些废话,只是为了练习 因为这是一个练习,我会给你一些建议,但不要写下整个解决方案 假设你真的应该做你在这里要求的事情(并且没有误解任务),你应该用变量替换文字等级(A,B,C,D,F)。因为你有5个等级,你需要5个变量或者5个元素的数组。你要求变量,所以对于这个练习,这就是方法 例如,由于您有5个变量,因此需要发明5个不同的名称
this=A
is=B
a=C
silly=D
exercise=F # Note: grade E does not exist
您可以在第一次使用这些定义之前在某个地方编写它们,并且可以随意使用更适合您的变量名。现在bash知道了这些变量,您可以使用它们,例如:
elif [ $average -ge 60 ]; then
echo "Course grade: $silly"
现在谈谈你没有要求但可能有兴趣知道的两件事:
首先,代码中平均值的计算不正确。如果将所有测试和实验室设置为1,则平均值为5(请尝试)
其次,在您的case
语句中,您使用的是一个变量grade
,您没有在任何地方设置它。例如,在你发现成绩是D的地方(你确实发现了这一点,因为你对这个事实做了echo
),你应该设置变量
grade=$silly
正如你所说,这项任务没有多大意义。。。。如果我们的等级和等级数量是完全可变的,这是有道理的。但是,这是一个练习问题,所以他们可能会要求你做一些废话,只是为了练习
因为这是一个练习,我会给你一些建议,但不要写下整个解决方案
假设你真的应该做你在这里要求的事情(并且没有误解任务),你应该用变量替换文字等级(A,B,C,D,F)。因为你有5个等级,你需要5个变量或者5个元素的数组。你要求变量,所以对于这个练习,这就是方法
例如,由于您有5个变量,因此需要发明5个不同的名称
this=A
is=B
a=C
silly=D
exercise=F # Note: grade E does not exist
您可以在第一次使用这些定义之前在某个地方编写它们,并且可以随意使用更适合您的变量名。现在bash知道了这些变量,您可以使用它们,例如:
elif [ $average -ge 60 ]; then
echo "Course grade: $silly"
现在谈谈你没有要求但可能有兴趣知道的两件事:
首先,代码中平均值的计算不正确。如果将所有测试和实验室设置为1,则平均值为5(请尝试)
其次,在您的case
语句中,您使用的是一个变量grade
,您没有在任何地方设置它。例如,在你发现成绩是D的地方(你确实发现了这一点,因为你对这个事实做了echo
),你应该设置变量
grade=$silly
在这种情况下,您可以让shell(特别是bash)通过使用数组来帮助您构建文本输出,并让字符类帮助您处理case
语句中的匹配,从而帮助您解决问题
例如,由于您知道您是在传统的A-F
90-50
断点上评分,因此您可以创建多个数组,以便为所有相关信息编制索引,例如
ltrgrades=( A B C D F )
numgrades=( 90 80 70 60 50 )
prefixes=( An A A A An )
comments=( "superior"
"above average"
"average"
"below average"
"failing" )
通过将关联索引作为其第一个参数传递,函数可以处理每个学生的所有输出需求:
results() {
echo
echo "Grade results . . ."
echo "Student name : $firstname $lastname"
echo "Total points : $sum"
echo "Course average: $average"
echo
echo "Course grade : ${ltrgrades[$1]}"
echo
echo "${prefixes[$1]} '${ltrgrades[$1]}' represents ${comments[$1]} course work."
}
利用herdoc
简化了提供多行输出:
## use a heredoc for multi-line text
cat << EOF
"=================="
"Grade Calculator "
"=================="
EOF
总而言之,你可以做到:
#!/bin/bash
# Bash shell script to calculate student average
# Usage: ./grade1.sh
ltrgrades=( A B C D F )
numgrades=( 90 80 70 60 50 )
prefixes=( An A A A An )
comments=( "superior"
"above average"
"average"
"below average"
"failing" )
results() {
echo
echo "Grade results . . ."
echo "Student name : $firstname $lastname"
echo "Total points : $sum"
echo "Course average: $average"
echo
echo "Course grade : ${ltrgrades[$1]}"
echo
echo "${prefixes[$1]} '${ltrgrades[$1]}' represents ${comments[$1]} course work."
}
## use a heredoc for multi-line text
cat << EOF
"=================="
"Grade Calculator "
"=================="
EOF
read -p "Enter first name : " firstname
read -p "Enter last name : " lastname
echo
read -p "Enter test score 1: " test1
read -p "Enter test score 2: " test2
read -p "Enter test score 3: " test3
read -p "Enter test score 4: " test4
read -p "Enter lab score : " lab
sum=$((test1 + test2 + test3 + test4 + lab))
average=$(echo "scale=2; $sum / 5" | bc)
case "${average%.*}" in
1?? ) results 0;;
9[0-9] ) results 0;;
8[0-9] ) results 1;;
7[0-9] ) results 2;;
6[0-9] ) results 3;;
* ) results 4;;
esac
由于等级是使用bc
作为浮点值计算的,因此您可以而且可能应该处理舍入(例如79.5
舍入到80
,而79.4
保留为79
。您可以使用另一个变量score
处理,类似于:
sum=$((test1 + test2 + test3 + test4 + lab))
average=$(echo "scale=2; $sum / 5" | bc)
fract=${average#*.}
score=${average%.*}
(( ${fract:0:1} >= '5')) && ((score++))
case $score in
1?? ) results 0;;
9[0-9] ) results 0;;
8[0-9] ) results 1;;
7[0-9] ) results 2;;
6[0-9] ) results 3;;
* ) results 4;;
esac
现在,Mary Jane的79.80
平均成绩被四舍五入为80
aB
而不是C
。由您决定如何处理四舍五入,这只是一种方法。您可以重新编写结果
以显示计算出的平均值和四舍五入的sc矿石
,例如
results() {
cat << EOF
Grade results . . .
Student name : $firstname $lastname
Total points : $sum
Course average: $average ($score)
Course grade : ${ltrgrades[$1]}
${prefixes[$1]} '${ltrgrades[$1]}' represents ${comments[$1]} course work.
EOF
}
results(){
cat在这种情况下,您可以让shell(特别是bash)通过使用数组来帮助您构建文本输出,并让字符类帮助您在case
语句中进行匹配,从而帮助您解决问题
例如,由于您知道您是在传统的A-F
90-50
断点上评分,因此您可以创建多个数组,以便为所有相关信息编制索引,例如
ltrgrades=( A B C D F )
numgrades=( 90 80 70 60 50 )
prefixes=( An A A A An )
comments=( "superior"
"above average"
"average"
"below average"
"failing" )
通过将关联索引作为其第一个参数传递,函数可以处理每个学生的所有输出需求:
results() {
echo
echo "Grade results . . ."
echo "Student name : $firstname $lastname"
echo "Total points : $sum"
echo "Course average: $average"
echo
echo "Course grade : ${ltrgrades[$1]}"
echo
echo "${prefixes[$1]} '${ltrgrades[$1]}' represents ${comments[$1]} course work."
}
利用herdoc
简化了提供多行输出:
## use a heredoc for multi-line text
cat << EOF
"=================="
"Grade Calculator "
"=================="
EOF
总而言之,你可以做到:
#!/bin/bash
# Bash shell script to calculate student average
# Usage: ./grade1.sh
ltrgrades=( A B C D F )
numgrades=( 90 80 70 60 50 )
prefixes=( An A A A An )
comments=( "superior"
"above average"
"average"
"below average"
"failing" )
results() {
echo
echo "Grade results . . ."
echo "Student name : $firstname $lastname"
echo "Total points : $sum"
echo "Course average: $average"
echo
echo "Course grade : ${ltrgrades[$1]}"
echo
echo "${prefixes[$1]} '${ltrgrades[$1]}' represents ${comments[$1]} course work."
}
## use a heredoc for multi-line text
cat << EOF
"=================="
"Grade Calculator "
"=================="
EOF
read -p "Enter first name : " firstname
read -p "Enter last name : " lastname
echo
read -p "Enter test score 1: " test1
read -p "Enter test score 2: " test2
read -p "Enter test score 3: " test3
read -p "Enter test score 4: " test4
read -p "Enter lab score : " lab
sum=$((test1 + test2 + test3 + test4 + lab))
average=$(echo "scale=2; $sum / 5" | bc)
case "${average%.*}" in
1?? ) results 0;;
9[0-9] ) results 0;;
8[0-9] ) results 1;;
7[0-9] ) results 2;;
6[0-9] ) results 3;;
* ) results 4;;
esac
由于等级是使用bc
作为浮点值计算的,因此您可以也可能应该处理舍入(例如79.5
舍入到80
,而79.4
保留为79
)