- 实验目的:
- 熟练掌握Shell程序的建立与执行;
- 掌握Shell变量的两种类型(Shell环境变量和用户自定义变量)及其用法;
- 掌握Shell中的特殊字符、算术与逻辑运算;
- 掌握Shell中输入输出命令;
- 掌握Shell程序控制结构语句。
实验内容:
在VMware中启动CentOS7虚拟机后,打开putty或者MobaXterm,远程登录root账号,完成以下任务,截图并粘贴于以下空行中。
利用vi在宿主目录中编写一个名为test8_1.sh的Shell程序,该程序查看当前目录和日期(脚本代码如下),并用给定的三种方式执行。
#!/bin/bash
echo "The current directory has the following files"
ls
echo "today is"
date
sh<程序名
sh 程序名
用chmod a+x 程序名,使该程序成为可执行文件,然后进入该程序文件所在目录,执行./程序名
说明:在这三种运行Shell程序的方法中,最好按下面的方式选择:当刚创建一个Shell程序,对它的正确性还没有把握时,最好使用第一或第二种方式进行调试。当一个Shell程序已经调试好时,应使用第三种方式把它固定下来,以后只要键入相应的文件名即可,并可被另一个程序所调用。另外,注意这三种运行方法都是创建一个新的Shell子进程来执行脚本内容。
利用vi在宿主目录中编写一个名为test8_2.sh的Shell程序,该程序在用户输入年、月之后,自动打印数出该年该月的日历。任选一种方法执行该程序。
#!/bin/bash
echo "Please input the month : "
read month
echo "Please input the year : "
read year
cal ① ②
Shell编程中,单引号和双引号是有区别的:单引号里所有字符或字符串都视为一般字符,而双引号仍然可以保留$、倒引号、反斜线\等特殊功能。比较以下两个命令的结果。
#!/bin/bash
echo "Please input your name?"
read name
echo "Hello, $name ! The number of users in the system is `who |wc -l`."
echo 'Hello, $name ! The number of users in the system is `who |wc -l`.'
利用vi在宿主目录中编写一个名为test8_4.sh的Shell程序,该程序根据用户输入的分数判断成绩是否通过考试。
#法1:使用if语句
#!/bin/bash
echo $score "please input a score:\c"
read score
echo "Your score is $score"
if [ $score -ge 60 ]; then #变量score的值大于等于60
then echo "Congratulation! You Pass the Examination."
else echo "Sorry! You Fail the Examination!"
if
#法2:使用case语句。注意理解由通配符和“|”隔开的多个模式组成的表达式。
#!/bin/bash
echo $score "please input a score:\c"
read score
echo "Your score is $score"
case $scorr in
[0-9]|[1-5][0-9]) echo "Sorry! You Fail the Examination!" ;; #0-9或者10-59
[6-9][0-9]|100) echo "Congratulation! You Pass the Examination." ;; #60-99或者100
esac
利用vi在宿主目录中编写一个名为test8_5.sh的Shell程序,该程序模拟一个多任务维护界面,当执行程序先显示菜单,然后进行选择后做相应的维护监控操作。显示菜单使用自定义函数实现。
#!/bin/bash
display()
{
echo " ----- Command Help Menu -----"
echo " h Show command help menu. "
echo " f Show all available block devices. "
echo " d Show the remaining disk space. "
echo " m Show the memory usage. "
echo " u Show how long the system is running. "
echo " q exit the program. "
}
display
while true
do
echo "Please select what you want to do (help h)"
read action
case $action in
h) display;;
f) lsblk;;
d) df -h;;
m) free -m;;
u) uptime;;
q) exit;;
esac
done
已知变量a=3,b=2,完成以下算术运算,并截图。
expr方法。注意运算符前后都有空格。
代码:expr $a - $b,用于计算a与b的差。仿此计算:
a与b的乘积。
a除以b的商。
a除以b的余数。
#!/bin/bash
a=3
b=2
# 计算 a 与 b 的乘积
product=$(expr $a \* $b)
echo "乘积: $product"
# 计算 a 除以 b 的商
quotient=$(expr $a / $b)
echo "商: $quotient"
# 计算 a 除以 b 的余数
remainder=$(expr $a % $b)
echo "余数: $remainder"
let方法。运算符前后不需要有空格,需要结合echo命令输出结果。
代码:let c=$a-$b; echo $c,用于计算变量a与b差。仿此计算:
a与b的乘积
a的b次方。符号“**”对两个变量做幂运算。
#!/bin/bash
a=3
b=2
# 计算 a 与 b 的乘积
let c=$a*$b
echo "乘积: $c"
# 计算 a 的 b 次方
let d=$a**$b
echo "幂: $d"
$((表达式))方法。运算符前后不需要有空格,且表达式中的变量前面不需要加上$符号,需要结合echo命令输出结果。
运行代码:c=$((a-b)); echo $c,用于计算变量a与b差。仿此计算:
a与b的乘积
a的b次方。符号“**”对两个变量做幂运算。
#!/bin/bash
a=3
b=2
# 计算 a 与 b 的乘积
c=$((a*b))
echo "乘积: $c"
# 计算 a 的 b 次方
d=$((a**b))
echo "幂: $d"
$[表达式]方法。与$((表达式))方法类似。
运行代码::c=$[a-b]; echo $c,用于计算变量a与b差。仿此计算:
a与b的乘积
a的b次方。符号“**”对两个变量做幂运算。
#!/bin/bash
a=3
b=2
# 计算 a 与 b 的乘积
c=$((a*b))
echo "Product: $c"
# 计算 a 的 b 次方
d=$((a**b))
echo "Power: $d"
利用vi在宿主目录中编写一个名为test8_7.sh的Shell程序,该程序实现计算用户输入命令后的若干个数字参数的和。例如运行sh test8_7.sh 1 2 3,结果是1、2、3的和6。
#法一:用for循环
#!/bin/bash
sum=0
for i #这里for i 完整的写法应该是 ①
do
let ②
done
echo sum= ③
#法二:用while循环和shift命令(注意理解shift命令的用法。供参考)
#!/bin/bash
sum=0
while [ $# -ne 0 ] #这里的$#表示命令后所有参数$1、$2…的总个数
do
let sum=$sum+$1 #想想这里为什么是$1
shift
done
echo sum=$sum
利用vi在宿主目录中编写一个名为test8_8.sh的Shell程序,该程序把当前目录下的所有*.sh文件到指定的目录(如home目录下某个普通用户的家目录下)中,并显示复制后该目录内按文件大小排序的目录文件清单。
echo "Please enter the destination directory name that you want to copy:"
read dir
if ① #文件测试。若变量dir代表的文件存在且是目录文件
then
for filename in ② #所有*.sh文件,使用通配符
do
cp $filename ③ #将所有*.sh文件复制到目标目录
done
ls -l $dir | sort -n -r -k 5 #-n数值排序,-r逆序,-k 5按第5个字段。教材P83
else
echo "$dir is a bad directory name."
fi
思考:
Shell变量两种类型,即Shell环境变量和____局部变量_________。Shell环境变量又分成可写和只读两大类。
在使用用户自定义变量时,要在变量名前面加上符号__$___。
Shell标准输入命令是__<stdin>_____,输出命令是___<stdout>_____。
Shell顺序结构中的操作符有4种:顺序分隔符(;)、__逻辑否(!)_______、逻辑与(&&)和逻辑或(||)。
通过使用Linux/Unix中文件重定向命令,可以将命令的输入、输出以及错误消息重定向到其他文件中,重定向方式有以下几种:输入重定向命令、输出重定向命令、输出附加定向命令和标准错误重定向命令,它们使用的符号分别是什么?
输入重定向命令:<
输出重定向命令:>
输出附加定向命令:>>
标准错误重定向命令:2>
Shell选择分支结构主要有2类:if语句和____case___语句。
Shell循环结构有3类语句:for语句、__while____语句和until语句。
Shell循环结构中的循环体需要放在___do__和___done___两个关键字之间。
Shell脚本中,退出脚本程序命令是____exit____。