一、字符串比对
字符串必须使用双引号
-n //nozero 字符串长度不为0时为真
-z //zero 字符串长度为0时为真
[root@web ~]# name=""
[root@web ~]# [ -z $name ]
[root@web ~]# echo $?
0
[root@web ~]# [ ! -z $name ]
[root@web ~]# echo $?
1
[root@web ~]# name="alex"
[root@web ~]# [ -z $name ]
[root@web ~]# echo $?
1
[root@web ~]# [ -n $name ]
[root@web ~]# echo $?
0
二、正则比对
正则比对必须用[[]]
~是匹配的意思
[root@web01 scripts]# [ "$USER" = "root" ]
[root@web01 scripts]# echo $?
0
[root@web01 scripts]# [[ "$USER" =~ ^r ]]
[root@web01 scripts]# echo $?
0
[root@web01 scripts]# [[ "$USER" =~ t$ ]]
[root@web01 scripts]# echo $?
0
[root@web01 scripts]# [[ ! "$USER" =~ t$ ]]
[root@web01 scripts]# echo $?
1
三、多整数比对
-a and 并且 正则比对里用&&
-o or 或者 正则比对里用||
案例一:批量创建用户 批量创建10个用户 oldboy1 oldboy2 oldboy3...oldboy10
要求密码统一设置为123456
1.输入用户的前缀 oldboy
判断如果为空 则退出
2.输入需要创建用户的个数 10
判断是否为整数
#!/bin/sh
read -p "please input prefix: " name
read -p "创建的个数: " num
for i in `seq $num`
do
useradd $name$i >/dev/null 2>&1
echo 123456|passwd --stdin $name$i &>/dev/null
[ $? -eq 0 ] && echo "$name$i create is ok"
done
四、if判断
案例:输入两个数字,是否为整数,并判断大小
#!/bin/bash
read -p "请输入第一个数字:" num1
read -p "请输入第二个数字:" num2
if [ -z $num1 ]
then
echo "您输入的第一个数字为空"&& exit
elif [ -z $num2 ]
then
echo "您输入的第二个数字为空"&& exit
elif [[ "$num1" =~ ^[0-9]+$ && "$num2" =~ ^[0-9]+$ ]]
then
if [ $num1 -lt $num2 ]
then
echo "$num1<$num2"
elif [ $num1 -gt $num2 ]
then
echo "$num1>$num2"
else
echo "$num1=$num2"
fi
else
echo "您输入了错误的值!"&& exit
fi
五、case流程语句
案例:批量删除用户
#!/bin/sh
read -p "请输入用户名前缀: " prefix
read -p "请输入要删除几个用户: " num
for i in `seq $num`
do
echo $prefix$i
done
read -p "你确定要删除以上用户吗?[y|yes|YES|n|N|no]" ready
for n in `seq $num`
do
name=$prefix$n
case $ready in
y|yes|YES)
id $name &>/dev/null
if [ $? -eq 0 ];then
userdel -r $name
[ $? -eq 0 ] && echo "$name del is ok"
else
echo "id: $name: no such user"
fi
;;
n|N|no)
echo "不删除我玩啥呢?" && exit
;;
*)
echo "USAGE $0 [y|yes|YES|n|N|no]"
esac
done
六、for循环
案例:使用for循环从1加到100
#!/bin/bash
#Author
for i in {1..100}
do
sum=$[sum+i]
done
echo $sum
命令行
for i in `seq 100`;do sum=$[sum+i];done;echo $sum
七、while循环
案例:使用while循环从1加到100
#!/bin/bash
#Author
i=0
while [ $i -le 100 ]
do
sum=$[sum+i]
let i++
done
echo $sum
案例:统计行号
while read line line 变量名 按行读取文件的内容
#!/bin/bash
#Author
while read line
do
let i++
done</etc/passwd
echo $i
八、流程控制语句 exit break continue
exit 退出整个脚本 不会继续执行
break 跳出本次循环 继续往下执行 跳出循环体
continue 结束当前此次的命令,继续下一次循环
#!/bin/sh
while true
do
echo ok
exit
echo hehe
done
echo done......
#!/bin/sh
while true
do
echo ok
break
echo hehe
done
echo done......
#!/bin/sh
while true
do
echo ok
continue
echo hehe
done
echo done......
九、函数
命令的集合 完成特定功能的代码块
模块化 复用
函数和变量类似 只有先定义才可以调用,如果只定义不调用 则不会执行
函数的定义和调用
三种方法
[root@web scripts]# cat fun.sh
#!/bin/sh
test1(){
echo "第一种函数定义方式"
}
function test2(){
echo "第二种函数定义方式"
}
function test3 {
echo "第三种函数定义方式"
}
test1
test2
test3
函数的传参 不能直接传参
1.在函数名后面跟参数
2.全局配置 在函数最上面设置变量
3.local 只在函数体内部生效
[root@web scripts]# cat fun.sh
#!/bin/sh
fun(){
if [ -f $1 ];then
echo "$1 exists"
else
echo "$1 no exists"
fi
}
fun $2 $3
#!/bin/sh
fun(){
num=20
for i in `seq 10`
do
sum=$[num+i]
done
echo $sum
}
fun
#!/bin/sh
fun(){
num=20
for i in `seq $1`
do
sum=$[num+i]
done
echo $sum
}
fun $3 $1 $2
函数返回值 return
[root@web scripts]# cat fun3.sh
#!/bin/sh
fun(){
if [ -f $1 ];then
return 50
else
return 100
fi
}
fun $1
if [ $? -eq 50 ];then
echo "ok"
else
echo "error"
fi
函数内如果执行的上一条是函数名 则不会返回函数本身执行的返回值
[root@web scripts]# cat fun4.sh
#!/bin/sh
fun(){
echo 50
return 1
}
re=`fun`
echo "函数的返回值是?: $?"
echo "函数执行的结果是?: $re"
[root@web scripts]# sh fun4.sh
函数的返回值是?: 1
函数执行的结果是?: 50
[root@web scripts]# cat fun4.sh
#!/bin/sh
fun(){
echo 50
return 1
}
re=`fun`
name=oldboy
echo "函数的返回值是?: $?"
echo "函数执行的结果是?: $re"
[root@web scripts]# sh fun4.sh
函数的返回值是?: 0
函数执行的结果是?: 50
坑:for循环可以区分空格
while循环按行读取
在shell中调用系统的/etc/init.d/functions,先执行这个文件,
在用action引用。