一.判断
无论是if,case,for,while都会用到判断
格式
test [ 判断语句 ] 或简写成 [ 判断语句 ]
整数值判断符号
常用于if判断中,比如判断上一条命令是否执行成功[ $? -eq 0 ]
符号 | 含义 |
---|---|
-eq | 等于 |
-ne | 不等于 |
-gt | 大于 |
-ge | 大于等于 |
-lt | 小于 |
-le | 小于等于 |
字符串判断符号
一般用于用户输入内容与指定字符是否一致,或判断用户输入字符是否有问题
符号 | 含义 |
---|---|
== | 内容一样 |
!= | 内容不一样 |
-z | 字符串为空 |
-n | 字符串不为空 |
str1 > str2 | 通过对应字符串的ASCII码进行比较,一般很少用 |
str1 < str2 | 通过对应字符串的ASCII码进行比较,一般很少用 |
文件或目录的判断
符号 | 含义 |
---|---|
-e | 文件或目录存在为真 |
-r | 文件或目录存在且可读 |
-x | 文件或目录存在且可执行 |
-s | 文件或目录存在且内容非空为真 |
-d | 目录存在为真 |
-f | 文件存在且为普通文件为真 |
-c | 文件存在且为字符型特殊文件为真 |
-b | 文件存在且为块文件为真 |
file1 -nt file2 | file1比file2更新为真 |
file1 -ot file2 | file1比file2更旧为真 |
file1 -ef file2 | file1比file2为同一文件为真(inode一致,硬链接文件) |
逻辑判断
一般用于两个或两个以上的条件进行筛选
符号 | 含义 |
---|---|
-a | 与 |
-o | 或 |
! | 非 |
注意,该方式在 [ ]内用 -a/-o表示,如果是在括号外则用&&/ ||
如:
这是一个交换式脚本,会根据用户从标准输入输入的数字来显示结果
read -p "input your num:" NUM
[ $NUM -lt 0 ] &&echo "$NUM小于0"
[ $NUM -ge 0 -a $NUM -le 100 ] && echo "$NUM在0到100之间" || echo "$NUM超过了100"
也可以写成
read -p "input your num:" NUM
[ $NUM -lt 0 ] &&echo "$NUM小于0"
[ $NUM -ge 0 ] && [ $NUM -le 100 ] && echo "$NUM在0到100之间" || echo "$NUM超过了100"
再举个例子:
#!/bin/bash
for i in {1..150}
do
if [ $i -le 100 ] && [ $i -ge 50 ]
then
echo $i
fi
done
或
#!/bin/bash
for i in {1..150}
do
if [ $i -le 100 -a $i -ge 50 ]
then
echo $i
fi
done
二.数学运算 expr
只能进行简单的整数运算
格式(在脚本中)
$(( $a + $b)) 或
$((a+b)) 或
$[ $a + $b ] 或
$(expr $a + $b) 或
`expr $a + $b`
#!/bin/bash
a=5
b=2
c=`expr $a + $b`
echo $c
还有一种比较特殊的格式"let"
在while循环中常用
i=1
sum=0
while (($i<= 100))
do
sum=$[ $sum + $i ]
let i++
done
echo $sum
注意,这里的 let i++ 还可以写成
let i+=1
i=$((i+1))
i=$($i+1)
i=$[$i+1]
i=`expr $i + 1`
i=$(expr $i + 1)
这里只要使用expr之后,运算符左右必须有空格,且变量必须用$。
运算符
符号 | 作用 |
---|---|
++ | 递加 |
– | 递减 |
+ | 加 |
- | 减 |
/ | 除 |
* | 乘(注意在命令提示符下要加转译符号,在(()),[]中不需要) |
% | 取余 |
> | 大于(注意同乘法) |
< | 小于 (注意同减法) |
比较符号 | 比较符号 |
< | 小于 |
<= | 小于等于 |
>= | 大于等于 |
逻辑运算 | 逻辑运算 |
&& | 与 |
|| | 或 |
! | 非 |
条件判断 | 条件判断 |
int1>int2?1:0 | 比较int1和int2大小,真输出1,假输出0 |
赋值运算 | 赋值运算 |
== | 等于 |
+= | 加等 |
-= | 减等 |
*= | 乘等 |
/= | 除等 |
%= | 余等 |
备注
a++ 是先取a的值再加
++a 是先加再取a的值
浮点型运算
a=$(echo "scale=4;12.5 / 7" | bc)
三.seq获取数字列表
格式
seq 1 5
[root@deny_zou ~]# seq 1 5
1
2
3
4
5
seq -w 01 05
[root@deny_zou ~]# seq -w 1 05
01
02
03
04
05
seq 1 2 10
[root@deny_zou ~]# seq 1 2 10
1
3
5
7
9
四.if
几乎可以用于所有判断环境
if [ $i -le 100 ] && [ $i -ge 50 ]
then
echo $i
fi
五.case
一般只能用于判断结果是固定值
在结果是固定值的情况,比if更好用,更方便
#!/bin/bash
read -p "input your choose yes/no:" CH
case $CH in
"yes"|"y")
echo "your choose is yes"
;;
"no"|"n")
echo "your choose is no"
;;
*)
echo "your write is wrong"
;;
esac
注意,这里|是正则表达式,同时也可以用[ ] 比如[0-9],但是只能匹配一个字符,如果超过,如[0-11],则匹配的内容为0,1,1
六.for
数字循环
for i in {5..10}
do
echo $i
done
此方法,5和10不能用变量,但是此方法可以做累减操作
for i in $(seq 5 10)
do
echo $i
done
此方法5和10都可以用变量,不能做累减操作,比如 $(seq 10 5),就会无法计数(这里$(seq 5 10)可以用`erq 5 10`代替)
for((i=5;i<=10;i++))
do
echo $i
done
可10和5可以用变量,也可做递减操作,可简写为:
awk "BEGIN{for(i=5; i<=10; i++) print i}"
字符循环
LIST="a b c d"
for i in $LIST
do
ehco $i
done
LIST为变量
for i in $*
do
echo $i
done
预定义变量,执行脚本时,需在sh 脚本名 后追加 输入的参数,如 sh test.sh a b c d,也可以做数字循环
for i in a b c d
do
echo $i
done
分别将a b c d显示出来
文件循环
for i in /var/log/*
do
echo $i
done
显示的文件名包含了绝对路径
for i in $(ls /var/log)
do
echo $i
done
只显示文件名
七.while
一般while的常用形式有这两种
形式一
i=1
sum=0
while [ $i -le 100 ]
do
let sum=$sum+$i
let i++
done
===============================================
注意和for循环的区别:
sum=0
for i in `seq 1 100`
do
sum=$sum+$i
done
echo $sum
形式二
i=1
sum=0
while (($i<= 100))
do
sum=$[ $sum + $i ]
let i++
done
echo $sum
====================================================
注意和for循环的区别:
sum=0
for ((i=1;i<=100;i++))
do
sum=$[ $sum + $i ]
done
echo $sum
终结一下for和while的使用区别
1.for的累加累减在条件中,而while则是在do下面做
2.do下面的操作,for,while基本没有区别
3.for 可以用 `seq 1 100`或$(seq 1 100)做循环条件,while不能
4.while要得到一个数字列表,需要先在循环前定义变量的基础值,然后在while 条件中对变量进行限制,最后在do中,对变量进行具体操作,而for,只需要在条件中进行定义,for在这块更加灵活好用(for可以用((i=1;i<=100;i++)))
5.while用true和false做无限循环,而for是用for (( ; ; ))
八.循环控制语句
break
跳出整个循环
continue
跳出本次循环
备注下:
变量在定义的时候就已经执行,而函数是在引用的时候才执行,可以写一个调用当前系统时间的脚本来测试