Linux Chapter2 Exercise

本科时期Linux 程序设计的实验文档整理。

一.实验内容

1、 编写shell程序,使用位置参数方法,输入10个学生成绩,判断学生成绩的等级:90分以上为A,小于90大于80分为B,小于80大于70位C,依次类推为D,小于60分为不及格。

实验结果截图:
Image

shell文件代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
#实现学生成绩的录入以及等级的评定
echo "Please input the 10 students' grade:"
#输入10个学生的成绩
read -a grade
#打印10个学生的成绩
echo "The 10 students' ranks are:"
for g in ${grade[*]}
do
        if [ $g -gt 100 ]; then
                echo "Wrong Grade"
        elif [ $g -gt 90 ]; then
                echo 'A'
        elif [ $g -gt 80 ]; then
                echo 'B'
        elif [ $g -gt 70 ]; then
                echo 'C'
        elif [ $g -ge 60 ]; then
                echo 'D'
        elif [ $g -ge 0 ]; then
                echo "F"
        elif [ $g -lt 0 ]; then
                echo "Wrong grade"
        fi
done

2、 编写shell程序,输入一个参数,判断输入的参数是文件还是文件夹,如果是文件,则显示出文件内容,如果是文件夹,则列出该文件夹中的文件。

实验结果截图:

当用户输入为文件:

Image

当用户输入为目录:Image

shell文件代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
#读取用户输入的参数
read file
#判断是文件还是目录
if [ -f $file ]
then
        echo " 这是一个文件,它的内容为:"
        cat $file
elif [ -d $file ]
then
        echo " 这是一个目录,目录中的文件有:"
        ls $file
fi

3、 使用for循环将某一个文件夹下的文件和目录移动到回收站中。

rm命令会直接删除文件而不是把文件放进回收站,且删除以后基本无法恢复。所以要将一个文件夹下的文件和目录移动到回收站,需要把rm命令改为mv命令。

我先是新建了一个testdir作为测试的目录,然后在testdir中有新建了两个目录和一个txt文件。

Image

运行linux2T3的shell文件,输入要删除的目录:

Image

接下来进入回收站检查一下,发现文件夹已经不再原位置了,里面的子文件夹和文件也都被移动到了回收站中:

实现结果截图:

Image

shell文件代码:

1
2
3
4
5
6
7
#!/bin/bash
echo "输入删除的目录:"
read folder
for file in $folder
do
        mv $file ~/.trash/
done                                   

4、 用for语句计算表达式1-1/2+1/3-1/4+….-1/n的值,n由键盘输入,小数点位数保留4位。

实现结果截图:

Image

shell实现的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
echo "此脚本用于计算1-1/2+1/3+...-1/N的值"
echo "请输入N:"
read N
result=0.0000
sum=0.0000
for((i=1;i<=$N;i++))
do
        result=`echo "scale=4;1/$i" | bc`
        if [ `expr $i \% 2` == 0 ];
        then
                sum=`echo "scale=4;$sum-$result" | bc`
        else
                sum=`echo "scale=4;$sum+$result" | bc`
        fi
done
echo "计算结果:$sum"

5、 使用循环语句编写程序输入密码,三次以内输入了正确密码,显示密码正确,进入系统,输错密码超过三次以上退出程序。

实验的时候特意用“stty -echo”让密码输入像ubuntu密码输入那样不显示出来。

实现结果截图:

当三次密码输入都错误时:

Image

当密码输入正确成功进入系统:

Image

shell文件代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
echo "此脚本用于用户密码输入三次检验。密码正确进入系统,密码三次输入错误退出程序。"
flag=0
i=3
rightStr="321321"
while((i>0));
do
        stty -echo #不显示用户输入
        read -p "请输入密码:" pswd
        if [ $pswd = $rightStr ];
        then
                flag=1
                break
        else
                ((i--))
                echo "密码错误!"
        fi
done
if [ $flag = 1 ];
then
        echo "成功进入系统!"
else
        echo "密码3次错误,退出程序!"
fi
stty echo

二.实验总结

虽然已经了解shell基本的语法了,但是在实际操作中还是遇到了这样那样的细节方面的错误。

下面我把我遇到的一些错误进行了整理:

1.未预期的符号 “then” 附近有语法错误

Image

遇见"未预期的符号"这种问题时,很多时候都是细节上出现了问题,比如说忘记了空格之类的。

2.shell (standard_in) 1: systax error 报错

遇见这种错误就是有非常低级的语法错误…比如说变量名不一致,比如说混淆了shell最基本的

算术比较和字符串比较,而下面我在第4题中同时犯了两个这样的错误…

Image
Image

3.linux2T5: 行 25: 语法错误: 未预期的文件结尾

遇到这种情况是因为if后面没有加上fi。

三.实验感想

shell本身的逻辑和以前学的各种语言都没什么区别,我觉得它真的很方便。这次作业题不难,但是在这次做作业的过程中我的习惯一时半会儿还改不过来,比如说总是忘记空格,比如说总是忘记在if后面加上fi,总是忘记在引用变量时在前面加上$的符号。

做第五题输入的时候抑或了半天,找了半天bug,逻辑没错代码没错为什么输入正确的密码还不让我进入系统呢…最后发现我的pswd变量和rightStr变量前面没有$…

Image

以后如果有机会用熟练linux了应该就不会总出现这样的问题了。