Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 设置变量以供以后在案例构造中使用_Linux_Bash_Shell_Conditional - Fatal编程技术网

Linux 设置变量以供以后在案例构造中使用

Linux 设置变量以供以后在案例构造中使用,linux,bash,shell,conditional,Linux,Bash,Shell,Conditional,我有一个实践问题,那就是要求我使用我现有的代码,并将字母等级的变量插入现有的“IF”语句中,以用于基于指定字母等级读取句子的case构造。我遇到的问题是如何首先设置变量,也就是说,我是否需要为变量设置一条全新的IF/ECHO线路?一开始我该怎么说呢 会不会是A级 以下是我到目前为止所做的:(编辑以包含建议) 正如你所说,这项任务没有多大意义。。。。如果我们的等级和等级数量是完全可变的,这是有道理的。但是,这是一个练习问题,所以他们可能会要求你做一些废话,只是为了练习 因为这是一个练习,我会给你一

我有一个实践问题,那就是要求我使用我现有的代码,并将字母等级的变量插入现有的“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
a
B
而不是
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