权限
-r:是否有读权限(read) -w:是否有写入权限(write) -x:是否有执行权限(excute)
(1)判断lixiang.sh是否有读权限
[ -r lixiang.sh ] && echo "YES"
(2)判断lixiang.sh是否有写权限
[ -w lixiang.sh ] && echo "YES"
(2)判断lixiang.sh是否有执行权限
[ -x lixiang.sh ] || echo "NO"
整型数值比较
-eq:等于(equals) -ne:不等于(not equals) -gt:大于(greater than) -lt:小于(lesser than) -ge:大于或等于(greater or equal) -le:小于或等于(lesser or equal)
(1)判断2和2是否相等
[ 2 -eq 2 ] && echo "YES"
(2)判断2和3是否相等
[ 2 -ne 3 ] && echo "YES"
(3)判断2是否大于3
[ 2 -gt 3 ] || echo "NO"
字符串判断
=:相等 !=:不相等
(1)判断字符串是否相等
[ 'kkkkk' != 'kkkk' ] && echo '不等于'
浮点型判断
(1)判断1.2是否小于1.3
[ `echo '1.2 < 1.3' | bc` -eq 1 ] && echo "YES"
3.shell脚本的输入以及特效的输出
3.1.shell脚本输入之read命令
语法:read -参数
-p:给出提示符,默认不支持”\n“换行 -s:隐藏输入的内容 -t:给出等待的时间,超出会推出read -n:限制读取自渡川的个数,触发时到临界的值会自动执行
3.2.shell脚本输出上色
语法:echo -e “\033[字背景颜色;字体颜色;特效字符串\033[关闭属性”
#字体色范围:30-37 echo -e "\033[30m 黑色字 \033[0m" echo -e "\033[31m 红色字 \033[0m" echo -e "\033[32m 绿色字 \033[0m" echo -e "\033[33m 黄色字 \033[0m" echo -e "\033[34m 蓝色字 \033[0m" echo -e "\033[35m 紫色字 \033[0m" echo -e "\033[36m 天蓝字 \033[0m" echo -e "\033[37m 白色字 \033[0m" #字背景颜色范围:40-47 echo -e "\033[40;37;5m 伟哥哥牛X!!! \033[0m" echo -e "\033[41;30;5m 轩哥哥牛X!!! \033[0m" echo -e "\033[42;34;5m 军哥哥牛X!!! \033[0m" echo -e "\033[43;34;5m 峰哥哥牛X!!! \033[0m" echo -e "\033[44;30;5m 博哥哥牛X!!! \033[0m" echo -e "\033[45;30;5m 杰哥哥牛X!!! \033[0m" echo -e "\033[46;30;5m 磊哥哥牛X!!! \033[0m" echo -e "\033[47;34;5m 想哥哥牛X!!! \033[0m" echo -e "\033[41;30;5m 琪哥哥牛X!!! \033[0m" # 特效范围 echo -e "\033[0m 无任何特效 \033[0m" echo -e "\033[1m 高亮度 \033[0m" echo -e "\033[4m 下划线 \033[0m" echo -e "\033[5m 闪烁 \033[0m"
4.grep、cut、awk、sed命令
4.1.grep:通常对数据进行行的提取
语法:grep [选项]…[内容]…file
-v:对内容进行取反 -n:显示行号 -w:精确查找 -i:忽略大小写 ^:匹配开头行首 -E:支持扩展正则
4.2.cut:通常对数据进行列的提取
语法:cut [选项] …[file]
-d:指定分割符 -f:指定截取区域 -c:以字符为单位进行分割
4.3.awk:通常对数据进行列的提取
语法:awk ‘条件{执行动作}’ 文件名
NR:表示行 NF:表示列 $NF:表示最后一列 $1:表示第一列 -F:指定分隔符 BEGIN:开始模块 RS:输入换行符 ORS:输出换行符(默认是\n) FS:输入记录分隔符 OFS:输出记录分隔符
4.4.sed:主要对数据行进行处理
语法:sed [选项] [动作] 文件名
-n:把匹配的行输出打印到屏幕 -p:通常与n一起使用 d:删除 a:在行的下面插入 i:在行的上面插入 c:整行替换 s###g:替换字符
5.shell编程的循环控制语句
5.1.if循环控制(单分支与多分支)
(1)单个判断
if [ 执行条件 ] then 执行语句 fi
(2)单个判断带else
if [ 执行条件 ] then 执行语句 else 执行语句 fi
(3)多个判断
if [ 执行条件 ] then 执行语句 elif [ 执行条件 ] 执行语句 ..... fi
5.2.for循环控制
(1)for 变量名 in 值1 值2 值3 .... do 执行语句 done
(2)for 变量名 in `命令` do 执行语句 done
(3)for ((条件)) do 执行动作 done
5.3.case循环控制
语法结构
case 变量 in 值1) 执行动作1 ;; 值2) 执行动作2 ;; 值3) 执行动作3 ;; .... esac
5.4.while循环
语法结构
while [ 执行条件 ] do 执行语句 done
6.shell的常见用法
6.1.查看内存的使用量
#!/bin/bash #查询内存的使用率 #by lixiang total=`free -m | sed -n '2p' | awk '{print$2}'` use=`free -m | sed -n '2p' | awk '{print$3}'` free=`free -m | sed -n '2p' | awk '{print$4}'` echo -e "当前内存总量:$total" echo -e "当前内存使用情况:$use" echo -e "当前内存剩余:$free" used=`echo "scale=2;$use / $total * 100" | bc` if [ `echo "$used > 10.00" | bc` -eq 1 ] then echo "当前超出预警,内存使用率:$used%" else echo "当前内存正常,内存使用率:$used%" fi
6.2.批量创建新用户
- 密码设置成用户名一样
#!/bin/bash #批量创建用户 #by lixiang read -p "请输入您要创建的用户前缀:" name read -p "请输入您要创建的个数:" num for ((i=1;i<=num;i++)) do #先判断用户存不存在 cat /etc/passwd | awk -F ":" '{print$1}' | grep -E "${name}$i" 1>/dev/null exist=`echo $?` if [ $exist -eq 1 ] then #创建用户 useradd ${name}$i #设置用户的密码 echo "${name}$i" | passwd --stdin ${name}$i > /dev/null && echo -e "用户名为:${name}$i , 密码为:${name}$i" >> new_user.txt echo "用户${name}$i创建成功,密码请去/root/shell/new_user.txt中查看" else echo "${name}$i 用户已存在" fi done
6.3.数据库查询
#!/bin/bash #查询数据库数据 #by lixiang 2021年8月 read -p "请输入要查询的人员姓名:" name read -s -p "请输入数据库的用户名:" username selectSql="select * from student.user where name = ${name}" mysql -u${username} -p -e "${selectSql}" exit #登录数据库交互界面:/usr/local/mysql/bin/mysql -uroot -p #登录数据库非交互界面:/usr/local/mysql/bin/mysql -uroot -p -e "sql" #查询当前数据库的所有库:show databases #使用当前库:use student #展示当前库的所有表:show tables
6.4.快速远程登录主机
#!/bin/bash #远程登录机器 #by lixiang read -p "请输入要登陆的主机名" name IP=`cat ip.txt | grep "${name}" | awk -F ":" '{print$2}'` ssh ${IP} echo "主机:${name},登录成功"
done
#### 6.3.数据库查询 ```bash #!/bin/bash #查询数据库数据 #by lixiang 2021年8月 read -p "请输入要查询的人员姓名:" name read -s -p "请输入数据库的用户名:" username selectSql="select * from student.user where name = ${name}" mysql -u${username} -p -e "${selectSql}" exit #登录数据库交互界面:/usr/local/mysql/bin/mysql -uroot -p #登录数据库非交互界面:/usr/local/mysql/bin/mysql -uroot -p -e "sql" #查询当前数据库的所有库:show databases #使用当前库:use student #展示当前库的所有表:show tables
6.4.快速远程登录主机
#!/bin/bash #远程登录机器 #by lixiang read -p "请输入要登陆的主机名" name IP=`cat ip.txt | grep "${name}" | awk -F ":" '{print$2}'` ssh ${IP} echo "主机:${name},登录成功"