2019-04-06 16:56:09
涉及编程,if判断, 脚本传参,for , while循环等,不太会写。
测试日常用的少,运维用得多。了解即可。
一、 引用变量
$name 或 $(name)
二、 条件判断
整数测试:
-gt :是否大于 (条件成立则输出0 ,否则为1)
-ge :是否大于等于
-lt:是否小于
-le:是否小于等于
-eq:是否等于
-ne:是否不等于
文件测试:测试文件的存在性以及属性测试
-e $file:是否存在 eg:#[-e /etc/文件名] ,存在为真,否则为假
-f $file:文件是否为普通文件
-d 文件是否为目录
-h 是否存在且为符合链接文件 -----/dev
-b 是否存在且为块设备文件 -----/dev
-s 是否存在且为套接文件 -----/var/lib/mysql/mysql.sock
-p 是否存在且为管道文件
-r 当前用户对文件是否有读权限
-w 当前用户对文件是否有写权限
-x 当前用户对文件是否有执行权限
注意:所有指令前!,表示该指令的反向功能
执行脚本的命令:bash sh ./
三、if 语句
格式:单分支:
if 条件;then
分支
fi
多分支:
if 条件;then
分支
else
分支
....
fi
eg1:用户不存在则创建用户
username=lianyou
if ! id $username &>/dev/null;then
useradd $username
echo 123456 |passwd --stdin $username
echo "$username:创建成功"
fi
eg2:如果用户存在则显示该用户,否则创建该用户
#!/bin/bash
username=xiaotangtang
if id $username &>/dev/null;then
echo "$username:该用户已经存在"
else
useradd $username
echo 123456 |passwd --stdin $username
echo "$username:用户创建OK"
fi
练习3:如果某路径不存在(chenyan/kj/skjd/akdsjh),则将其创建为目录:否则显示其存在,并显示其类型(file指令获取文件类型)
#!/bin/bash
filename=/duoceshi19/a/b/c/d
if [ -e $filename ];then
echo "$filename:存在"
file $filename #file获取文件类型
else
mkdir -p $filename
echo "$filename:创建成功"
fi
四、脚本传参
./file.sh /etc/passwd /etc/passwd .......
$0 $1 $2 $n
eg4:判断脚本传入的第一个位置参数$1是否为文件,如果是文件则统计文件行数,否则显示文件不存在或不是一个文件
#!/bin/bash
if [ $# -lt 1 ];then
echo "请传递一个参数"
exit 1
fi
if [ -f $1 ];then
nl $1
else
echo "你传入的是什么啊!!!"
fi
练习5:通过脚本参数传递一个文件路径给脚本,判断其类型?
if [ $# -lt 1 ];then
echo "必须给一个参数"
exit 1
fi
if [ -f $1 ];then
echo "这是个文件"
elif [ -d $1 ];then
echo "这是个目录"
elif [ -h $1 ];then
echo "这是个符号链接"
elif [ -b $1 ];then
echo "这是个块设备文件"
else
echo "输入的是啥啊!我不认识"
fi
除了脚本参数其次还可以用与用户交互的方式:
例子6:讲解read命令,体现与用户交互(通过键盘输入一个用户)
read命令:read 命令从标准输入中读取一行
用户忘记输入一个用户,则给用户一个默认值,如果第二次不给值,则脚本将显示用户存在(第一次创建过);这时必须我们输入了个新用户;
#!/bin/bash
read -p "请输入一个用户:" -t 5 username
if [ -z $username ];then
username=uuuuu
fi
if id $username &>/dev/null;then
echo "$username:存在"
else
useradd $username
echo 123456 |passwd --stdin $username
echo "$username:ok"
fi
练习7:写一脚本能接受任意输入两数进行大小比较?(考虑输入的两个数是相等的)
#!/bin/bash
read -p "请输入两个数:" -t 5 numb1 numb2
if [ -z $numb1 ];then
echo "输入两个数"
exit 1
fi
if [ -z $numb2 ];then
echo "必须输入两个数"
exit 1
fi
if [ $numb1 -lt $numb2 ];then
echo "max is $numb2,min is $numb1"
else
echo "max is $numb1,min is $numb2"
fi
五、for循环,while循环,算术运算
循环语句
循环的关键就是生成列表
列表生成方式:1、for i in {1..10}
2、seq 1 10
3、seq 1 2 10 :生成奇数列表
4、seq 0 2 10: 生成偶数列表
eg8:1.给系统添加10个用户,如果存在则提示用户存在,否则创建10个用户?(user1-user10)
#!/bin/bash
for i in {1..10};do ---------------for i in $(seq 1..10)
if id user$i &>/dev/null;then
echo "user$i exists"
else
useradd user$i
echo "$i:ok"
fi
done
eg9:1.删除刚刚创建好好的10个用户?(user1-user10)
#!/bin/bash
for i in {1..10};do
if id user$i &>/dev/null;then
cd /usr/sbin
./userdel -r user$i
fi
done
算术运算
在shell中,‘let’可以进行数值的加减乘除等运算操作,一般用于流程控制结构或者执行需要的运算,
注意let只能执行整数的相关操作,运算结果也只能保存整数。
运算表示:$[$a+$b] $(($a+$b))
eg10:求1到100的整数之和
#!/bin/bash
declare -i sum=0
for i in {1..100};do
sum=$[$sum+$i]
done
echo $sum
eg11:如果求1-100奇数之和
#!/bin/bash
declare -i sum=0
for i in $(seq 1 2 100);do
sum=$[$sum+$i]
done
echo $sum
while循环:----用控制变量来控制
while 条件;do
循环体
done
进入while循环:当“条件”为真时进入
退出while条件:当“条件”为假时退出
eg12:求1到100的整数之和
#!/bin/bash
declare -i sum=0
declare -i i=0
while [ $i -le 100 ];do
let sum=$[$sum+$i]
let i++
done
echo "sum:$sum"
练习13:打印九九乘法表
#!/bin/bash
declare -i i=1
declare -i j=1
while [ $j -le 9 ];do
while [ $i -le $j ];do
echo -e -n "${i}X${j}=$[ $i*$j ] " #:-e:处理字符 -n:不换行输出 :制表符
let i++
done
echo
let i=1
let j++
done
while之死循环
格式
while true;do
if 条件;then
break
fi
done
eg14:每隔三秒查看当前系统是否有chenyandan用户登入;如果登入了则显示该用户登入,如果未登入,仍然显示未登入,并显示已经是多少次查看登入情况
#!/bin/bash
username=$1
declare -i count=0
while true;do
if who |grep "^$username";then
echo "$username: login"
break
else
let count++
echo "$count:$username:not login"
fi
sleep 3
done
作业题:(未完成)