算数表达式运算
1、用expr
格式 expr m + n 或$((m+n)) 注意expr运算符间要有空格
例如计算(2+3 )×4 的值
1 .分步计算
赋值:
[root@hadoop2 home]# S=expr 2 + 3
[root@hadoop2 home]# B=expr $S \* 4
## *号需要转义
[root@hadoop2 home]# echo $B
2.一步完成计算
expr expr 2 + 3
* 4
echo expr \
expr 2 + 3` * 4`
2、用(())
((1+2))
(((2+3)*4))
count=1
((count++))
echo
c
o
u
n
t
报
错
−
b
a
s
h
:
s
y
n
t
a
x
e
r
r
o
r
n
e
a
r
u
n
e
x
p
e
c
t
e
d
t
o
k
e
n
‘
(
′
但
是
要
想
取
到
运
算
结
果
,
需
要
用
count 报错 -bash: syntax error near unexpected token `(' 但是要想取到运算结果,需要用
count报错−bash:syntaxerrornearunexpectedtoken‘(′但是要想取到运算结果,需要用引用
a=$((1+2))
3、用
[
]
a
=
[] a=
[]a=[1+2]
echo $a
4、用let
i=1
let i++
2.5 流程控制
2.5.1 if语法
1、语法格式
if condition
then
statements
[elif condition
then statements. …]
[else
statements ]
fi
2、示例
#!/bin/bash
read -p "please input your name:" NAME ## read命令用于从控制台读取输入数据
printf '%s\n' $NAME
if [ $NAME = root ]
then
echo "hello ${NAME}, welcome !"
elif [ $NAME = ydhl2]
then
echo "hello ${NAME}, welcome !"
else
echo "SB, get out here !"
fi
问题:[root@hdp01 ~]# ./nihao.sh
please inter your name:!huangxiaoming
hello huangxiaoming ,welcom
应该是输出SB, get out here !
原因:
if [ $NAME=root ] =号左右没有空格 $NAME=root默认是输入一个参数,只要这个参数(不包括什么也不输入会报错),就永远都是true,条件永远成立
所以注意=号左右的空格
可以这么写:
#!/bin/bash
read -p "please inter your name:!" NAME
if [ ! -n "$NAME" ]; then echo "please nest time enter your name!"
elif [ $NAME = root ]
then
echo "hello $NAME , welcome!"
elif [ $NAME = xiaoming ]
then
echo "hello $NAME ,welcom"
else
echo "sb,get out here!"
fi
3、判断条件
1/ 条件判断基本语法
[ condition ] (注意condition前后要有空格)
#非空返回true
[ edu360 ]
#空返回false
[ ]
注意[ ]内部的=周边的空格,有区别:
[root@shizhan01 scripts]# if [ a = b ];then echo ok;else echo notok;fi
notok
[root@shizhan01 scripts]# if [ a=b ];then echo ok;else echo notok;fi
ok
短路(理解为三元运算符)
[ condition ] && echo OK || echo notok
[root@hadoop2 home]# a=2
[root@hadoop2 home]# b=2
[root@hadoop2 home]# [ $a = $b ] && echo ok || echo notok
条件满足,执行&&后面的语句;条件不满足,执行|| 后面的语句
2/ 条件判断组合
注:[] 与[[ ]] 的区别:[[ ]] 中逻辑组合可以使用 && || 符号
而[] 里面逻辑组合可以用 -a -o
一下a,b,c取值代表的是字母,
[root@mini ~]# if [ a = b && b = c ]; then echo ok;else echo notok;fi
-bash: [: missing `]’
notok
[root@mini ~]# if [ a = b -a b = b ]; then echo ok;else echo notok;fi
notok
[root@mini ~]# if [ a = b -o b = b ]; then echo ok;else echo notok;fi
ok
其中-a是and;-o是or
[root@mini ~]# if [[ a = b && b = b ]]; then echo ok;else echo notok;fi
notok
[root@mini ~]# if [[ a = b || b = b ]]; then echo ok;else echo notok;fi
ok
3/ 常用判断运算符
字符串比较:
= 字符串是否相等
!= 字符串是否不相等
-z 字符串长度为0返回true
-n 字符串长度不为0返回true
if [ ‘aa’ = ‘bb’ ]; then echo ok; else echo notok;fi
if [ -n “aa” ]; then echo ok; else echo notok;fi
if [ -z “” ]; then echo ok; else echo notok;fi
整数比较:
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
还可以用转义的数学符号 <
文件判断:
-d 是否为目录
if [ -d /bin ]; then echo ok; else echo notok;fi
-f 是否为文件
if [ -f /bin/ls ]; then echo ok; else echo notok;fi
-e 是否存在
if [ -e /bin/ls ]; then echo ok; else echo notok;fi
2.5.2 while语法(用的少)
1、方式一
while expression
do
command
…
done
2、方式二
i=1
while ((i<=3))
do
echo $i
let i++
done
2.5.3 case语法(用的多)
case $1 in
start)
echo “starting”
;;
stop)
echo “stoping”
;;
*)
echo “Usage: {start|stop}”
esac
2.5.4 for语法
1、方式一
for N in 1 2 a
do
echo $N
done
或
for N in 1 2 3; do echo $N; done
或
for N in {1…3}; do echo $N; done
2、方式二
for ((i = 0; i <= 5; i++))
do
echo “welcome $i times”
done
或
for ((i = 0; i <= 5; i++)); do echo “welcome $i times”; done