shell编程-运算符
运算符号
常用运算符号
+:加
echo $((1+254))
-:减
echo $((26-24))
*:乘
echo $((11*3))
/:除
echo $((21/3))
%:取余
echo $((9%2))
++:自增
--:自减
余数的使用
## 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
# 随机抽同学脚本
#!/bin/bash
read -p '请输入滚动次数' count
clear
for ((i=1;i<=$count;i++))
do
line=$(cat /root/stu.txt | wc -l)
num=$((RANDOM%$line+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" 同学
##
echo $((RANDOM%15))
最多到14
0~14
所以需要在后面+1才能随机到最后一个同学
##
sed -n '2p' /etc/passwd
将/etc/passwd的第二行打印出来
##
printf "$stu \r"
把stu这个变量格式化打印出来 \r是回车
##
sleep 0.1
反应时间 0.1
自增
- 一般开发使用
for(i=1;i++;i<=10){
}
i=1 1
i++ i=i+1
i-- i=i-1
# 自增试验脚本(开发)
[root@web02 ~]# cat zz.sh
for ((i=1;i<=10;i++));do
echo $i
done
[root@web02 ~]# sh zz.sh
1
2
3
4
5
6
7
8
9
10
# 自增脚本(运维)
[root@web02 ~]# cat zz.sh
#for ((i=1;i<=10;i++));do
# echo $i
#done
for n in `seq 10`;do
echo $n
done
[root@web02 ~]# sh zz.sh
1
2
3
4
5
6
7
8
9
10
逻辑符号
常用逻辑符号
&&
:且,前面的命令执行成功后,再执行后面的命令,前面的不成功,则后面的也不执行
||
:或,前面的命令执行不成功,才能执行后面的命令,前面的成功,则后面的不执行
!
:非,取反
所有符号
符号 | 作用 |
---|---|
+、- | 加号,减号,一般用于整型、浮点型等类型的运算,其他语言中也可以做字符串的拼接 |
*、/、% | 乘号、除号、取余,一般用于运算 |
** | 幂运算 |
++、-- | 自增、自减,可前置也可后置,默认步长为1 |
&&、||、! | 且、或、非 |
<、<=、>= 、> | 小于、小于等于、大于等于、大于 |
==、!=、= | 等于,可用于数字和字符串、不等于、赋值 |
<<、>> | 向左位移、向右位移 |
~、|、&、^ | 按位取反、按位异或、按位与、按位或 |
+=、-+、*=、/=、%= | 赋值运算:a+=1 即 a=a+1 ... 依次类推 |
+ -
整型 浮点型等等的运算 其他语言也可以做字符串的拼接
--------------------------------------------------------
乘号、除号、取余,一般用于运算
--------------------------------------------------------
** 几的几次方
2三次方
2**3
2的10次方 1024
[root@web02 ~]# echo $((2**20))
1048576
-------------------------------------------------------
++ --
n++ n=n+1
n-- n=n-1
n=n+2
-------------------------------------------------------
&&、||、!
逻辑运算
-------------------------------------------------------
<、<=、>= 、>
<
>
<=
>=
<> /!= 不等于
-------------------------------------------------------
==、!=、=
== 用于字符串和数字
!= 不等于
= 赋值
-------------------------------------------------------
<<、>>
-------------------------------------------------------
~、 |、 &、 ^
取反 按位异或 按位与 按位或
-------------------------------------------------------
+=、-+、*=、/=、%=
n=n+2 n+=2
赋值运算
shell里的运算方式
(())
[root@web02 ~]# echo $((5*9))
45
# 不支持非整型
let
[root@web02 ~]# let a=5+7
[root@web02 ~]# echo $a
12
# 不支持非整型
expr
[root@web02 ~]# expr 1 + 5
6
# 不支持非整型
bc
[root@web02 ~]# 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'.
4+8
12
^C
(interrupt) Exiting bc.
[root@web02 ~]# echo 1+8|bc
9
[root@web02 ~]# echo 26/5|bc
5
[root@web02 ~]# echo 26/5|bc -l
5.20000000000000000000
awk
[root@web02 ~]# awk 'BEGIN{print 1+2}'
3
[root@web02 ~]# awk 'BEGIN{print 3+2}'
5
[root@web02 ~]# awk 'BEGIN{print 26/5}'
5.2
[root@web02 ~]# awk 'BEGIN{print 1+2,26/5,3+9}'
3 5.2 12
作业1
1.首先传递两个参数(2个数字)
2.传少了报错
3.传的不是数字也报错
4.计算出传递的两个参数的
-
+
-
-
-
*
-
/
-
%
#!/bin/bash
num1=$1
num2=$2
if [ "$#" -ne 2 ];then
echo "错误啦:参数个数不对哦,请传递两个数字作为参数。"
exit 1
fi
[[ re =^[0-9]+$|^[0-9]+\.[0-9]+$ ]]
if ! [[ $1 =~ $re && $2 =~ $re ]];then
echo "错误啦:可不可以用数字啊。"
exit 1
else
echo "$num1 + $num2 = `expr $num1 + $num2`"
echo "$num1 - $num2 = `expr $num1 - $num2`"
echo "$num1 x $num2 = `expr $num1 \* $num2`"
if [ "$2" -eq 0 ];then
echo "被除数不能为零哦"
exit 1
fi
echo "$num1 ÷ $num2 = `expr $num1 / $num2`"
echo "$num1 % $num2 = `expr $num1 % $num2`"
fi
#!/bin/bash
num1=$1
num2=$2
[ $# -ne 2 ] && {
echo '请输入两个参数'
exit 1
} || {
expr $num1 + $num2 + 1 &>/dev/null
[ $? -ne 0 ] && {
echo '请输入两个整数'
exit
}||{
echo "$num1 + $num2 = `expr $num1 + $num2`"
echo "$num1 - $num2 = `expr $num1 - $num2`"
echo "$num1 x $num2 = `expr $num1 \* $num2`"
#echo "$num1 ÷ $num2 = `expr $num1 / $num2`"
#echo "$num1 % $num2 = `expr $num1 % $num2`"
}&& {
[ $num2 -eq 0 ] &&{
echo '除数不能为0'
} || {
echo "$num1 ÷ $num2 = `expr $num1 / $num2`"
echo "$num1 % $num2 = `expr $num1 % $num2`"
}
}
}
num1=$1
num2=$2
[ $# -eq 2 ] &&{
[[ $num1 =~ ^[0-9]+$|^[0-9]+\.[0-9]+$ ]] && [[ $num2 =~ ^[0-9]+$|^[0-9]+\.[0-9]+$ ]] && {
[ $num2 != '0' ] && {
echo "$num1 + $num2" = `awk -v a=$num1 -v b=$num2 "BEGIN{print a + b}"`
echo "$num1 - $num2" = `awk -v a=$num1 -v b=$num2 "BEGIN{print a - b}"`
echo "$num1 x $num2" = `awk -v a=$num1 -v b=$num2 "BEGIN{print a * b}"`
echo "$num1 ÷ $num2" = `awk -v a=$num1 -v b=$num2 "BEGIN{print a / b}"`
echo "$num1 % $num2" = `awk -v a=$num1 -v b=$num2 "BEGIN{print a % b}"`
}||{
echo '除数不能为0'
}
}|| {
echo '不能输入字母或者特殊符号'
}|| {
echo '请输入两个整数'
}
}