shell做计算
+ 加
- 减
* 乘
/ 除
++ 自增
-- 自减
# 加
[root@web02 bin]# echo $((1+256))
257
# 减
[root@web02 bin]# echo $((26-26))
0
# 乘
[root@web02 bin]# echo $((11*3))
33
# 除法
[root@web02 bin]# echo $((21/3))
7
# 取余
[root@web02 bin]# echo $((10%3))
1
余数的使用
#脚本示例
#!/bin/bash
read -p '请输入滚动次数:' count
clear
for ((i=1;i<=$count;i++))
do
line=$(cat /root/stu.txt | wc -l)
num=$((RANDOM%$line+1)) #//echo $((RANDOM%15) 最多到14 0~14 所以要+1来匹配最后
stu=`sed -n "${num}p" stu.txt`
sleep 0.1
printf "$stu \r"
done
username=$(sed -n "${num}p" stu.txt)
echo -e 这次回答问题的是: "\033[32m $username \033[0m" 同学。
--------------------------------------------------------------------------------------------------
脚本的解析如下:
1. 提示用户输入滚动次数,并将其存储在变量 `count` 中。
2. 清除终端屏幕。
3. 使用命令 `wc -l` 计算文件 `stu.txt` 中的行数,并将结果存储在变量 `line` 中。
4. 使用 `$RANDOM` 生成一个随机数,并将其与行数取余,得到一个随机的行号,存储在变量 `num` 中。
5. 使用 `sed` 命令读取 `stu.txt` 文件中的第 `num` 行,并将其存储在变量 `stu` 中。
6. 通过 `printf` 命令将学生的姓名打印到终端,并使用 `\r` 光标归位字符使得每次输出覆盖上一次的输出,实现滚动效果。
7. 重复步骤 4 至 6 直到达到指定的滚动次数。
8. 最后,使用 `sed` 命令再次读取 `stu.txt` 文件中的第 `num` 行,并将其存储在变量 `username` 中。
9. 打印出回答问题的学生姓名,使用绿色字体。
-----------------------------------------------------------------------------------------------------
## 1.使用RANDOM取随机数
[root@zabbix01 ~]# echo $RANDOM
27899
## 随机数的范围是 :man bash 可以查到 0 and 32767 总共32768个数
## 但是有时候,我想在一个范围内随机,例如,咱们班有100个学生,我想在100内随机抽取一名幸运观众。
## 那么就需要使用取余的方式来完成了。
[root@zabbix01 ~]# echo $((RANDOM%10))
9
[root@zabbix01 ~]# echo $((RANDOM%10))
7
[root@zabbix01 ~]# echo $((RANDOM%10))
5
[root@zabbix01 ~]# echo $((RANDOM%10))
4
[root@zabbix01 ~]# echo $((RANDOM%10))
9
[root@zabbix01 ~]# echo $((RANDOM%10))
8
[root@zabbix01 ~]# echo $((RANDOM%10))
6
自增
一般开发使用
# 一般在使用运算的时候,有时候会写 i=i+1那么我们就可以简写成 i++
# for循环中
for(i=1;i++;i<=10){
这个循环就相当于,第一次循环的时候,i=1
第二次循环的时候,i=i+1 也就是 i=1+1即 i=2
第三次循环的时候,i=i+1 也就是 i=2+1即 i=3
第四次循环的时候,i=i+1 也就是 i=3+1即 i=4
第五次循环的时候,i=i+1 也就是 i=4+1即 i=5
第六次循环的时候,i=i+1 也就是 i=5+1即 i=6
...
一直循环到10,因为i给了一个最大范围是小于等于10
}
逻辑符号
#常用逻辑符号
&&:且,前面的命令执行成功后,再执行后面的命令,前面的不成功,则后面的也不执行
||:或,前面的命令执行不成功,才能执行后面的命令,前面的成功,则后面的不执行
!:非,取反
所有符号
符号 | 作用 |
---|---|
+、- | 加号,减号,一般用于整型、浮点型等类型的运算,其他语言中也可以做字符串的拼接 |
*、/、% | 乘号、除号、取余,一般用于运算 |
++、-- | 自增、自减,可前置也可后置,默认步长为1 |
&& | |
<、<=、>、>= | 小于、小于等于、大于等于、大于 |
==、!=、= | 等于,可用于数字和字符串、不等于、赋值 |
<<、>> | 向左位移、向右位移 |
** | 幂运算 |
~ | 、&、^ |
+=、-+、*=、/=、%= | 赋值运算:a+=1 即 a=a+1 ... 依次类推 |
运算方式
方式一:(()) //不支持非整形,即小数点类型
# 1.常规运算
[root@zabbix01 script]# echo $((1+1))
2
[root@zabbix01 script]# echo $((2**10))
1024
## 2.变量运算
[root@zabbix01 script]# n1=111
[root@zabbix01 script]# n2=222
[root@zabbix01 script]# echo $((n1+n2))
333
## 3.运算赋值
# 方法一
[root@zabbix01 script]# n3=`echo $((n1*n2))`
[root@zabbix01 script]# echo $n3
24642
# 方法二
[root@zabbix01 script]# ((n4=n1*n2))
[root@zabbix01 script]# echo $n4
24642
方式二: let //不支持非整形,即小数点类型
[root@zabbix01 script]# let a=1+2
[root@zabbix01 script]# echo $a
3
[root@zabbix01 script]# i=1
[root@zabbix01 script]# let i++
[root@zabbix01 script]# echo $i
2
[root@zabbix01 script]# n=10
[root@zabbix01 script]# let n+=2
[root@zabbix01 script]# echo $n
12
方法三:expr //不支持非整形,即小数点类型
## 错误写法
[root@zabbix01 script]# expr 2+2
2+2
## 正确姿势
[root@zabbix01 script]# expr 2 + 2
4
## 错误写法,因为*在bash里是通配符,所以echo一下就知道
[root@zabbix01 script]# expr 2 * 3
expr: syntax error
[root@zabbix01 ~]# echo expr 1 * 1
expr 1 zls.txt 1
## 正确姿势
[root@zabbix01 script]# expr 2 \* 3
6
## expr可以用来判断某一个数字是不是整型
# 如果变量是一个字符串
[root@zabbix01 ~]# age=xxx
[root@zabbix01 ~]# expr 1 + $age
expr: non-integer argument
[root@zabbix01 ~]# echo $?
2
# 如果变量是整型
[root@zabbix01 ~]# age=18
[root@zabbix01 ~]# expr 1 + $age
19
[root@zabbix01 ~]# echo $?
0
方法四:bc
[root@zabbix01 ~]# echo 1+2 |bc
3
[root@zabbix01 ~]# echo 2.5+3 |bc
5.5
[root@zabbix01 ~]# echo 1/3 |bc
0
[root@zabbix01 ~]# echo 1/3 |bc -l
.33333333333333333333
## 它是交互式的
[root@zabbix01 ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1+1
2
{1}
## 在bc中幂运算,只能用 ^不能用 **,跟开发语言有关
2^10
1024
{1}
## 进制转换
# 十六进制
[root@zabbix01 ~]# echo 'obase=16;16'|bc
10
[root@zabbix01 ~]# echo 'obase=16;15'|bc
F
[root@zabbix01 ~]# echo 'obase=16;13'|bc
D
{1}
# 二进制
[root@zabbix01 ~]# echo 'obase=2;15'|bc
1111
[root@zabbix01 ~]# echo 'obase=2;18'|bc
10010
{1}
方法六:awk
## 支持多运算
[root@zabbix01 ~]# awk 'BEGIN{print 1+2,2**10}'
3 1024
## 直接显示小数
[root@zabbix01 ~]# awk 'BEGIN{print 1+2,2**10,2.5*3,1/3}'
3 1024 7.5 0.333333
## 变量运算
# 错误写法
[root@zabbix01 ~]# x=1
[root@zabbix01 ~]# y=2
[root@zabbix01 ~]# awk 'BEGIN{print x/y}'
awk: cmd. line:1: fatal: division by zero attempted
# 正确姿势
[root@zabbix01 ~]# awk -v x=1 -v y=2 'BEGIN{print x/y}'
0.5
# 那么我们就可以引用命令行的变量了
[root@zabbix01 ~]# awk -v x=$a -v y=$b 'BEGIN{print x/y}'
2
注册账号及登录模拟
题目:
注册账号
1.注册的账号和密码保存在文件txt之中
tls 123
zls 456
2.检测这个用户是否注册过
3.登录的时候 匹配用户和密码是否一致
tls 123
zls 456
#先创建用户密码存储文件
touch pass.txt
#注册账号信息,编辑脚本
#!/bin/bash
file="/root/pass.txt"
name(){
echo "+--------------------------+"
echo "| 注册账号 |"
echo "+--------------------------+"
read -p '请输入用户名:' username
read -sp '请输入密码:' pass
#检查账号是否以经存在
if grep -w "$username" "$file"
then
echo "账号已存在"
else
#把账户名密码写入到文件
echo "$username:$pass" >> "$file"
echo "创建成功"
fi
#登录
echo "+--------------------------+"
echo "| 登录账号 |"
echo "+--------------------------+"
read -p '请输入用户名:' username
read -sp '请输入密码:' pass
if grep -w "$username:$pass" "$file" &>/dev/null
then
echo "登录成功"
else
echo "账号密码错误"
fi
}
name
计算器编写
题目:
1.首先传递两个参数(2个数字)
2.传少了报错
3.传的不是数字也报错
4.计算出传递的两个参数的如下值
+
*
/
%
#编写脚本
#!/bin/bash
num1=$1
num2=$2
if [ $# -ne 2 ]
then
echo "输入参数个数错误"
elif ! [[ $num1 =~ ^[0-9]+$ && $num2 =~ ^[0-9]+$ ]]
then
echo "请输入数字参数"
fi
echo $(($num1+$num2))
expr $num1 - $num2
awk -v n=$1 -v m=$2 'BEGIN{print n*m}'
awk -v n=$1 -v m=$2 'BEGIN{print n/m}'
echo $(($num1 % $num2 ))