shell 运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# 算术运算符
# + - * / % 加 减 乘 除 取余
# ** 幂运算
# ++ -- 自增或自减 可放到变量前或后,放在变量前,先自加或自减再取值
# ! && 逻辑非 逻辑与 逻辑或
# < <= > >= 比较运算符 小于小于等于 大于大于等于
# == != = 相等 不相等 对于字符串=表示相等
# << >> 向左移位 向右移位
# ~ & ^ 按位取反 按位异或 按位与 按位或
# = += -+ *= /= %= 赋值运算符

# 算术运算命令
# (()) 用于整数运算 echo $((3+4)) 效率更高
# let 用于整数运算 类似于(())
# expr 用于整数运算
# bc linux下计算器程序 需要yum install bc -y echo 3+4bc 可用于整数和小数运算
# $[] 用于整数运算
# awk awk可用于整数运算 可以用于小数运算
# declare 定义变量值和属性 -i参数可用于定义整数变量做运算
#

# 练习
a=6
b=2
echo "a + b = $(($a+$b))"
echo "a - b = $(($a-$b))"
echo "a × b = $(($a*$b))"
echo "a ÷ b = $(($a/$b))"
echo "a % b = $(($a%$b))"

# 进一步改进支持传参计算任意值
if [ -z "$1" -o -z "$2" ]; then
echo "参数不完整"
exit 1
fi
echo "a + b = $(($1+$2))"
echo "a - b = $(($1-$2))"
echo "a × b = $(($1*$2))"
echo "a ÷ b = $(($1/$2))"
echo "a % b = $(($1%$2))"

# 再次优化
checkNum() {
# -z为空返回true 反之false -n为空表示是整数返回false 反之true
if [ -z "$1" -o -n "`echo $1sed 's/[0-9]//g'`" ]; then
echo "输入错误,请输入一个整数"
exit 1
fi
}

checkOp() {
echo "test"
}

read -p "请输入第一个整数: " num1
checkNum $num1
read -p "请输入第一个整数: " num2
checkNum $num2
read -p "请输入运算符: " op
checkOp $op
echo "$num1 $op $num2 = $(($num1$op$num2))"

# let 赋值表达式 相当于 ((赋值表达式))
i=2
let i+=8 # 相当于((i+=8)) 效率更高
echo $i

# expr + - \* / %
expr 2 + 3

i=6
i=`expr $i + 6`

# 判断一个变量是否为整数
expr $i + 6 &>/dev/null # &>/dev/null 不保留任何输出
echo $? # 返回0 说明i是整数

# 判断输入是整数还是字符串
if [ -z "$1" ]; then
echo "参数不完整"
exit 1
fi
expr $1 + 6 &>/dev/null
[ $? -eq 0 ] && echo "int" echo "char"

#优化 持续判断
while true
do
read -p "请输入: " a
if [ -n "$a" ]; then
expr $a + 6 >/dev/null 2>&1
[ $? -eq 0 ] && echo "int" echo "char"
fi
done
# 进一步改进支持传参计算任意整数
if [ -z "$1" -o -z "$2" ]; then
echo "参数不完整"
exit 1
fi
expr $1 + $2 + 6 >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "请输入2个整数"
exit 2
fi
echo "a + b = $(($1+$2))"
echo "a - b = $(($1-$2))"
echo "a × b = $(($1*$2))"
echo "a ÷ b = $(($1/$2))"
echo "a % b = $(($1%$2))"

# expr其他用法 判断文件后缀名是否符合要求
expr "sdfad.txt2" : ".*\.txt$" >/dev/null 2>&1

# 计算字符串长度
s="teststrings"
expr length "$s"
echo ${#s}
echo $swc -L
echo $sawk '{print length($0)}'

# bc 计算器 支持小数
bc #进入交互界面
3+3
3*3
echo 3+3bc

i=6
i=`echo $i+6bc`

# sep 生成数字序列 -s指定数字序列分隔符
sep -s "+" 10
# {1..10} 生成以空格为间隔数字序列 tr将空格替换为+
echo {1..10}tr " " "+"

# 应用
echo `seq -s "+" 10`=`seq -s "+" 10bc`
echo `seq -s "+" 10`=$((`seq -s "+" 10`))
echo `seq -s "+" 10`=`seq -s " + " 10xargs expr`

# awk运算 支持小数
echo "3.6 8.6"awk '{print ($1+$2)}'

# declare 定义整数变量 与typeset
declare -i A=66 B=6
A+=B
echo $A

# $[] 运算符
i=6
i=$[i+6]
echo $i

# read命令
# 语法 read [参数] [变量名]
# -p 设置提示信息
# -t 设置等待输入时间 单位秒
read -t 5 -p "Please input one number: " num1
read -t 5 -p "Please input tw0 number: " num1 num2