Shell字符串对比
1.字符串比对,字符串必须使用双引号
[ "name" = "name" ]
[ "name" != "name" ]
[root@web ~]# [ "$USER" = "root" ]
[root@web ~]# echo $USER
root
[root@web ~]# [ "$USER" = "root" ]
[root@web ~]# echo $?
0
[root@web ~]# [ "$USER" = "alex" ]
[root@web ~]# echo $?
1
[root@web ~]# [ "$USER" != "alex" ]
[root@web ~]# echo $?
0
- -z字符串为空,输出正确 -n字符串为非空,输出正确
[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
- -z 案例:
read -p "请输入名字" name1
[ -z $name1 ] && echo "请输入姓名否则不继续执行" && exit
read -p "请输入年龄" age1
echo $name1 $age1
Shell正则比对
- [[ ]]
[[]]
[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
2.判断传参的参数是否为整数
方法一:
[root@web01 scripts]# age=188
[root@web01 scripts]# [[ "$age" =~ ^[0-9]+$ ]]
[root@web01 scripts]# echo $?
0
[root@web01 scripts]# age=188q
[root@web01 scripts]# [[ "$age" =~ ^[0-9]+$ ]] && echo $?
[root@web01 scripts]# [[ "$age" =~ ^[0-9]+$ ]] || echo $?
1
[root@web01 scripts]# age=18.8
[root@web01 scripts]# [[ "$age" =~ ^[0-9]+$ ]]
[root@web01 scripts]# echo $?
1
方法二:
expr $1 + 0 >/dev/null 2>&1
[ $? -ne 0 ] && exit
多整数比对
-
-a and
-o or[ 10 -eq 10 -a 100 -ne 100 ] [root@web01 scripts]# [ 10 -eq 10 -a 100 -ne 100 ] [root@web01 scripts]# echo $? 1 [root@web01 scripts]# [ 10 -eq 10 -a 100 -eq 100 ] [root@web01 scripts]# echo $? 0 [root@web01 scripts]# [ 10 -eq 10 -o 100 -ne 100 ] [root@web01 scripts]# echo $? 0 [root@web01 scripts]# [[ 10 -eq 10 && 100 -ne 100 ]] [root@web01 scripts]# [[ 10 -eq 10 -a 100 -ne 100 ]] -bash: 条件表达式中有语法错误 -bash: `-a' 附近有语法错误 [root@web01 scripts]# [[ 10 -eq 10 && 100 -ne 100 ]] [root@web01 scripts]# echo $? 1 [root@web01 scripts]# [[ 10 -eq 10 || 100 -ne 100 ]] [root@web01 scripts]# echo $? 0
2.案例:传入两个数字 比对两个数字的大小
例如:sh count.sh 10 10 要求判读是否传入两个参数 要求数字加判读是否为整数(禁止if)
10=10
#!/bin/sh
[ $# -ne 2 ] && echo "please input two number" && exit
[[ ! $1 =~ ^[0-9]+$ ]] && echo "请输入整数" && exit 50
[[ ! $2 =~ ^[0-9]+$ ]] && echo "请输入整数" && exit 100
[ $1 -eq $2 ] && echo "$1=$2"
[ $1 -gt $2 ] && echo "$1>$2"
[ $1 -lt $2 ] && echo "$1<$2"
3.案例:批量创建用户 批量创建10个用户 oldboy1 oldboy2 oldboy3...oldboy10
要求密码统一设置为123456
1.输入用户的前缀oldboy,判断如果为空 则退出
2.输入需要创建用户的个数 10,判断是否为整数
#!/bin/sh
#read -p "please input prefix: " name
#read -p "创建的个数: " num
for i in {1..10}
do
echo oldboy$i
done
[root@web01 scripts]# cat useradd.sh
#!/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
4.案例:判断当前10.0.0.0/24网络中 有哪些IP地址在线 ping通则在线
#!/bin/sh
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
for i in `seq 254`
do
{ IP=10.0.0.$i
ping -c 1 -W 1 $IP >/dev/null 2>&1
[ $? -eq 0 ] && action "ping $IP is" /bin/true
} &
done
网络知识
ip addr add 10.0.0.3/24 dev eth0 临时生效 重启失效
面试题 配置一条默认网关
route add default gw 10.0.0.254
删除网关
route add default gw 10.0.0.254
其他方法 静态路由方式
ip route add 0/0 via 10.0.0.254
策略路由
服务器使用vpn常用 网关被替换成vpn
pptpstup 拨号命令
查看网关
route -n
开机启动配置文件(/etc/rc.local) +x 权限 rc.d/rc.local (禁止使用alias和变量)
if判断
1.单分支
if [你有房];then [ -f file ] && echo ok
if [你有房]
then
我就嫁给你
fi
双分支
if [ 你有房 ] [ -f file ] && echo ok || echo error
then
我就嫁给你
else
拜拜
fi
2.多分支
if [ 你有房 ]
then
我就嫁给你
elif [ 你有钱 ]
then
我也嫁给你
elif [ 你爸是李刚 ]
then
我也嫁给你
elif [ 活好!运维技术好 ]
then
我倒贴也嫁给你
elif [ 你在老男孩学运维 ]
then
我考虑考虑
else
拜拜
fi
3.案例:输入两个数字 是否为整数 使用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
4.案例:根据操作系统不同的版本安装不同的源
1.如何取出版本号
2.如何做版本号的比对
3.比对完成执行相对应的安装源
#!/bin/sh
ve=`cat /etc/redhat-release |awk '{print $(NF-1)}'`
#centos6.x使用以上命令获取不到版本号
if [ ${ve%%.*} -eq 7 ]
then
#判断网络是否通畅ping 如果不通 则重启systemctl restart network 通继续执行
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
#测试wget是否已安装 无安装先安装wget
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
elif [ ${ve%%.*} -eq 6 ]
then
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
fi
5.案例:猜数字
生成一个随机数 1-100之间
RANDOM 随机数的范围 0-32767
取余
echo $((RANDOM%100+1))
用户输入一个数字
判断用户输入的数字如果相等则退出提示猜对了 大了 提示比随机数大 小了 提示 比随机数小
#!/bin/sh
ran=`echo $((RANDOM%100+1))`
while true
do
let i++
read -p "请输入一个数字[1-100]: " num
if [ $num -gt $ran ];then
echo "你输入的数字大了"
elif [ $num -lt $ran ];then
echo "你输入的数字小了"
else
echo "恭喜你猜对了 总共猜了 $i 次"
exit
fi
done