实验(八)Shell 算术运算、选择结构

2023-04-21 19:06:25 浏览数 (2)

1. 新建工作目录

目录命名为班级加姓名的格式,如 1banz3

参考代码:

代码语言:shell复制
mkdir 1banz3
# 切到 1banz3 目录:
cd 1banz3

2. 创建Shell脚本文件

代码语言:shell复制
touch compute.sh

3. 编辑Shell脚本

代码语言:shell复制
vi compute.sh

输入以下代码:

代码语言:shell复制
#!/bin/bash
#(())
a=2
b=$((a**2)) #幂运算
echo $b
f=$((c=b 3,d=b-3,e=d*3))
echo $c $d $e $f
#bc
echo "2.3 5.8"|bc
echo "scale=3;8/3"|bc
echo "scale=3;var1=8;var1/3"|bc #scale指定小数位数
var2=3
echo "scale=3;var1=8;var1/$var2"|bc #引用Shell变量:用$
var3=$(echo "scale=3;var1=8;var1/$var2"|bc)
echo "var3=$var3" #打印var3的值

4. yum安装bc计算程序

代码语言:shell复制
sudo yum install bc

提示做选择时按y然后按回车即可

输入命令bc按回车可以直接运行bc计算程序

代码语言:shell复制
bc

启动bc程序后会进入交互式计算模式,例如,输入 1.1*3 按回车,会打出计算结果 3.3

bc的内置变量 scale 可以指定除法或取余运算的小数位数

例如:4/3的结果是1。

将scale赋值为3,再输入4/3,可以看到结果为1.333

另外,使用bc内定义的变量不需要$符号

退出bc程序:输入 quit 命令

5. 运行Shell脚本

代码语言:shell复制
chmod  x compute.sh
./compute.sh

参考运行结果

代码语言:text复制
4
7 1 3 3
8.1
2.666
2.666
2.666
var3=2.666

6. 文件测试脚本

代码语言:shell复制
touch test1.sh

输入以下代码:

代码语言:shell复制
echo "判断当前工作目录下是否有hello.c文件:存在结果为0,否则为1"
[ -a hello.c ] # 条件测试语句,与 test -a hello.c 等价。注意参数用空格隔开
echo "结果是:$?" #使用$?查看上述条件测试运行的结果
if [ ! -f hello.c ]
then
  echo "hello.c文件不存在,即将用touch命令新建hello.c文件"
  touch hello.c
  [ -a hello.c ]
  echo "新建文件后再次判断的结果是:$?"
else
  echo "hello.c文件已存在,可以用ll hello.c查看权限"
fi
  • 条件测试的表达式写在一对方括号[]内,例如 [ -f hello.c ],或者采用test命令加参数的写法,例如 test -f hello.c,所以要注意:不同的运算符(方括号也算在内)和操作数用空格隔开。
  • Shell编程中,条件测试结果为true,则返回退出状态为0,否则结果为false,并返回非0退出状态。
  • 所以,编写Shell时,不能以C编程中0表示false,非0表示true的方式来理解。
  • ! 是逻辑运算符的一种,可以放在任何表达式前面,表示逻辑非运算的结果。注意,使用逻辑非运算符左右用空格隔开。

运行脚本

代码语言:shell复制
bash test1.sh

参考运行结果:

代码语言:text复制
判断当前工作目录下是否有hello.c文件:存在结果为0,否则为1
结果是:1
hello.c文件不存在,即将用touch命令新建hello.c文件
新建文件后再次判断的结果是:0

可以再次运行脚本,看到第二种运行结果:

代码语言:text复制
判断当前工作目录下是否有hello.c文件:存在结果为0,否则为1
结果是:0
hello.c文件已存在,可以用ll hello.c查看权限

7. if 选择结构

新建if.sh脚本

输入以下代码:

代码语言:shell复制
#!/bin/bash
read -p "请输入你的分数:" Score
if [ "$Score" -ge 0 -a "$Score" -le 59 ];then
    echo "不通过"
elif [ "$Score" -ge 60 -a "$Score" -le 79 ];then
    echo "通过"
elif [ "$Score" -ge 80 -a "$Score" -le 100 ];then
    echo "优秀"
else
    echo "请输入一个0到100之间的数"
fi
  • 条件测试中,整数的比较有专用的写法,例如-eq表示运算符前后两个整数值相等,-ne表示运算符前后两个整数值不相等,而常用的=!=运算符专用于比较字符串。
  • -a 是逻辑运算符中的逻辑与运算,类似的,-o 表示逻辑或。
  • 逻辑运算的优先级会低于比较运算,但可以用圆括号改变优先级顺序,需要注意的是,在Shell中,圆括号需要用反斜杠转义后使用。

运行if.sh脚本,参考运行结果:

代码语言:text复制
请输入你的分数:60
通过

8. case选择结构

新建case.sh脚本

输入以下代码:

代码语言:shell复制
#!/bin/bash
read -n 1 -p "请输入一个字符:" char
echo
case $char in 
    [a-z])
        echo "小写字母"
        ;;
    [A-Z])
        echo "大写字母"
        ;;
    [0-9])
        echo "阿拉伯数字"
        ;;
    *)
        echo "其它符号"
esac

参考运行结果:

代码语言:text复制
请输入一个字符:A
大写字母

0 人点赞