1. 条件判断
1.1 条件判断类型
- 整数测试 // 判断大小,是否相等
- 字符测试 // 判断字符串的字母顺序等
- 文件测试 // 是否存在,大小等
1.2 条件测试表达式
[ expression ]
[[ expression ]]
test expression
[root@master ~]# [ 1 -gt 2 ] ## 前后要有空格
[root@master ~]# echo $?
1
[root@master ~]# [[ 1 -gt 2 ]]
[root@master ~]# echo $?
1
[root@master ~]# test 1 -gt 2
[root@master ~]# echo $?
1
# 判断1是否大于2
1.3 整数测试(双目(2个数测试为双目))
-eq
-ne
-gt
-lt
-ge
-le
#均为英文单词缩写
1.4 字符测试
==
!=
=~
-z "string"
-n "string"
[root@master ~]# [ 'abc1' == 'abc' ]
[root@master ~]# echo $?
1
[root@master ~]# [[ 'abc1' =~ a. ]]
[root@master ~]# echo $?
0
[root@master ~]# [[ 'abc1' =~ 'a.' ]]
[root@master ~]# echo $?
1
[root@master ~]# [[ 'abc1' =~ "a." ]]
[root@master ~]# echo $?
1
[root@master ~]# [ -z "" ]
[root@master ~]# echo $?
0
[root@master ~]# [ -z " " ]
[root@master ~]# echo $?
1
[root@master ~]# a=
[root@master ~]# [ -z $a]
[root@master ~]# echo $?
0
[root@master ~]# a=10
[root@master ~]# [ -z $a ]
[root@master ~]# echo $?
1
[root@master ~]# [[ 'azc' > 'adb' ]]
[root@master ~]# echo $?
0
[root@master ~]# [[ 'azc' > 'acz' ]]
[root@master ~]# echo $?
0
[root@master ~]# [[ 'azc' < 'acz' ]]
[root@master ~]# echo $?
1
[root@master ~]# [[ 'Azc' > 'bzc' ]]
[root@master ~]# echo $?
1
[root@master ~]# [[ 'Azc' > 'azc' ]]
[root@master ~]# echo $?
0
#字母相同时,大写的字母大
#大致按ASCII表来看,
1.5 文件测试
-e
-b
-c
-f
-d
-h
-L
-p
-S
-r
-w
-x
-g
-u
-k
-s
-t fd
file1 -ef file2
file1 -nt file2
file1 -ot file2
-N
-O
-G
[root@master ~]# touch abc
[root@master ~]# [ -e abc ]
[root@master ~]# echo $?
0
[root@master ~]# mkdir ab
[root@master ~]# [ -e ab ]
[root@master ~]# echo $?
0
[root@master ~]# [ -f abc ]
[root@master ~]# echo $?
0
[root@master ~]# [ -f ab ]
[root@master ~]# echo $?
1
1.6 组合测试条件
-a
-o
!
[root@master ~]# [ 1 -gt 2 -a 2 -gt 1 ]
[root@master ~]# echo $?
1
[root@master ~]# [ 1 -lt 2 -a 2 -gt 1 ]
[root@master ~]# echo $?
0
[root@master ~]# [ 1 -gt 2 -o 2 -gt 1 ]
[root@master ~]# echo $?
0
[root@master ~]# [ 1 -lt 2 ] && [ 2 -gt 1 ]
[root@master ~]# echo $?
0
1.7 条件判断,控制结构
1.7.1 单分支if语句
if 判断条件; then
statement1
statement2
......
fi
[root@master ~]# bash useradd.sh tom
[root@master ~]# id tom
uid=1001(tom) gid=1001(tom) 组=1001(tom)
[root@master ~]# bash useradd.sh tom
[root@master ~]# cat useradd.sh
#!/bin/bash
id $1 &> /dev/null #不显示输出
if [ $? -ne 0 ];then
useradd $1
fi
1.7.2 双分支if语句
if 判断条件; then
statement1
statement2
......
else
statement3
statement4
......
fi
1.7.3 多分支if语句
if 判断条件1; then
statement1
statement2
......
elif 判断条件2; then
statement3
statement4
......
else
statement5
statement6
......
fi
[root@master ~]# ./test.sh 2
>1
[root@master ~]# ./test.sh 1
=1
[root@master ~]# ./test.sh 0
<1
[root@master ~]# cat test.sh
#!/bin/bash
if [ $1 -gt 1 ];then
echo '>1'
elif [ $1 -lt 1 ];then
echo '<1'
else
echo '=1'
fi
#与python类似
2. 模式匹配:case
case $变量名 in
value1)
statement
...
;;
value2)
statement
...
;;
*)
statement
...
;;
esac
*
?
[]
abc|bcd
[root@master ~]# ./case.sh 1
you input 1
[root@master ~]# ./case.sh 2
you input 2
[root@master ~]# ./case.sh 3
you input 3
[root@master ~]# ./case.sh 6
errro
[root@master ~]# cat case.sh
#!/bin/bash
case $1 in
1)
echo 'you input 1'
;;
2)
echo 'you input 2'
;;
3)
echo 'you input 3'
;;
*)
echo ' errro'
;;
esac
3. 循环语句
shell中有3种循环语句
- for
- while
- until
循环语句通常需要有一个进入条件和一个退出条件。 死循环只有进入条件
3.1 for循环
for循环当列表不为空时进入循环,否则退出循环
for 变量 in 列表; do
循环体
done
for ((expr1;expr2;expr3))
{
循环体
}
for (( expr1 ; expr2 ; expr3 ));do
循环体
done
expr1
expr2
expr3
{1..100}
seq [起始数] [步进长度] 结束数
[root@master tmp]# ./for.sh
=====================
sshd:x:74:74:Privilege-separated
=====================
SSH:/var/empty/sshd:/sbin/nologin
=====================
avahi:x:70:70:Avahi
=====================
mDNS/DNS-SD
=====================
Stack:/var/run/avahi-daemon:/sbin/nologin
=====================
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
=====================
tcpdump:x:72:72::/:/sbin/nologin
=====================
l:x:1000:1000:l:/home/l:/bin/bash
=====================
mysql:x:988:982::/home/mysql:/sbin/nologin
=====================
tom:x:1001:1001::/home/tom:/bin/bash
=====================
[root@master tmp]# cat for.sh
#!/bin/bash
echo =====================
for line in $(cat /tmp/passwd);do
echo $line
echo =====================
done
也可以
[root@master tmp]# ./for.sh
=====================
sshd:
=====================
SSH:
=====================
avahi:
=====================
mDNS/DNS-SD:
=====================
Stack:
=====================
postfix: /sbin/nologin
=====================
tcpdump: /sbin/nologin
=====================
l: /bin/bash
=====================
mysql: /sbin/nologin
=====================
tom: /bin/bash
=====================
[root@master tmp]# cat for.sh
#!/bin/bash
echo =====================
for line in $(cat /tmp/passwd);do
echo $line | awk -F: '{print $1": "$7}'
echo =====================
done
[root@master ~]# ./for1.sh
1
2
3
4
5
6
7
8
9
10
[root@master ~]# cat for1.sh
#!/bin/bash
for ((i=1;i<=10;i++))
{
echo $i
}
等同于
[root@master ~]# ./for1.sh
1
2
3
4
5
6
7
8
9
10
[root@master ~]# cat for1.sh
#!/bin/bash
for i in {1..10};do
echo $i
done
还可以
[root@master ~]# ./for1.sh
1
2
3
4
5
6
7
8
9
10
[root@master ~]# cat for1.sh
#!/bin/bash
for i in $(seq 10);do
echo $i
done
批量创建用户
[root@master ~]# ./for1.sh
useradd:用户“user1”已存在
user1 创建成功。
useradd:用户“user2”已存在
user2 创建成功。
useradd:用户“user3”已存在
user3 创建成功。
useradd:用户“user4”已存在
user4 创建成功。
useradd:用户“user5”已存在
user5 创建成功。
useradd:用户“user6”已存在
user6 创建成功。
useradd:用户“user7”已存在
user7 创建成功。
useradd:用户“user8”已存在
user8 创建成功。
useradd:用户“user9”已存在
user9 创建成功。
useradd:用户“user10”已存在
user10 创建成功。
[root@master ~]# cat for1.sh
#!/bin/bash
for ((i=1;i<=10;i++));do
useradd user$i
id user$i &>/dev/null
if [ $? -eq 0 ];then
echo " user$i 创建成功。"
fi
done
批量删除
[root@master ~]# ./for1.sh
user1 删除成功。
user2 删除成功。
user3 删除成功。
user4 删除成功。
user5 删除成功。
user6 删除成功。
user7 删除成功。
user8 删除成功。
user9 删除成功。
user10 删除成功。
[root@master ~]# cat for1.sh
#!/bin/bash
for ((i=1;i<=10;i++));do
userdel -r user$i
id user$i &> /dev/null
if [ $? -ne 0 ];then
echo " user$i 删除成功。"
fi
done
|