shell编程补充内容(Linux课程实验3)
一、求前五个偶数的和
1.这里先介绍要用到的expr
1. 整数计算
# 加法(注意运算符两侧空格)
$ expr 10 + 20
30# 带括号的运算(需要转义)
$ expr \( 10 + 20 \) \* 2
60# 取模运算
$ expr 15 % 4
注意:仅支持整数,不支持小数运算3
2. 字符串操作
# 计算字符串长度
$ expr length "helloworld"
10# 查找字符位置(返回首次出现的索引)
$ expr index "abcdef" "cd"# 提取子字符串(位置从1开始)
$ expr substr "linuxshell" 3 5
nuxsh# 正则匹配(返回匹配的字符数)
$ expr match "hello123" ".*[0-9]"
3. 逻辑比较
# 比较两个数值
$ expr 10 \> 5
1 # 返回1表示真# 判断字符串相等性
$ expr "abc" = "abc"
运算类型 | expr写法 | $(( ))写法 | let写法 |
---|---|---|---|
加法 | expr $a + $b | $((a + b)) | let res=a+b |
乘法 | expr $a \* $b | $((a * b)) | let res=a*b |
复合运算 | expr \( ... \) | $(( ( ... )) ) | 支持原生括号 |
带变量的字符串拼接计算
read -p "输入第一个数: " input1
read -p "输入第二个数: " input2
total=$(expr $input1 + $input2)
echo "计算结果: $input1 + $input2 = $total"
数直接相加
num1=15
num2=30
sum=$(expr $num1 + $num2)
echo "15 + 30 = $sum" # 输出 45
2.代码编写
该脚本计算从0开始的前5个偶数之和,最终输出结果为20。数学表达式为:0+2+4+6+8=200+2+4+6+8=20
二、设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30。(暂时没有完成)
mkdir -p 会创建这些上级目录,确保整个目录路径都被创建。
例如,如果你执行 sudo mkdir -p /etc/docker,这个命令会创建 /etc/docker 目录。如果 /etc 目录已经存在,那么 docker 目录会被创建在 /etc 下。如果 /etc 目录不存在,mkdir -p 会先创建 /etc 目录,然后再创建 docker 目录。
在sudo groupadd -f class1
命令中,-f
选项的作用是强制执行。
具体来说,-f
选项的作用是即使指定的组已经存在,也会以成功状态退出。当与-g
选项一起使用时,如果指定的组已经存在,并且与-g
选项指定的组名相同,-f
选项会使得命令执行成功,而不是报错
三、自己编写一个脚本
由键盘循环输入学生的成绩,并根据学生成绩输出相应的成绩等级,若小于60分,则输出“not pass ”,若成绩大于60小于等于70分,则输出“D”,若成绩大于70分,小于等于80分,则输出“C”,若成绩大于80小于九十,则输出“B”,若成绩大于九十分,则输出“A”。
#!/bin/bashwhile true; doread -p "请输入学生成绩(输入q退出): " input# 退出条件判断if [[ "$input" == "q" ]]thenecho "程序已退出"breakfi# 输入有效性验证if [[ ! "$input" =~ ^[0-9]+(\.[0-9]+)?$ ]]thenecho "错误:请输入数字或q退出"continuefi# 数值范围验证score=$(echo "$input" | bc)if [[ $(echo "$score < 0 || $score > 100" | bc -l) -eq 1 ]]thenecho "错误:成绩应在0-100之间"continuefi# 成绩分级逻辑if [[ $(echo "$score >= 90" | bc -l) -eq 1 ]]thengrade="A"elif [[ $(echo "$score >= 80" | bc -l) -eq 1 ]]thengrade="B"elif [[ $(echo "$score >= 70" | bc -l) -eq 1 ]]thengrade="C"elif [[ $(echo "$score >= 60" | bc -l) -eq 1 ]]thengrade="D"elsegrade="未通过"fiecho "成绩等级:$grade"
done
read -p
显示交互式提示符- 有效性认证使用了正则表达式进行判断,相关内容学习请查看:创作中心-CSDN
[[ ... ]]
:这是bash
中用于条件测试的双中括号结构,相较于单中括号[ ... ]
支持更多的特性,比如正则表达式匹配。
在 if [[ $(echo "$score < 0 || $score > 100" | bc) -eq 1 ]]
中:
echo "$score < 0 || $score > 100"
会输出一个布尔表达式,例如80 < 0 || 80 > 100
。| bc
会对这个布尔表达式进行求值,若表达式为真,bc
会输出1
;若为假,则输出0
。