Linux-shell自动化编程
1.常用命令解释器
Shell命令解释器:bash编程.
编程环境准备
2.shell脚本执行方式
3.变量
变量名字命名要求:
- 1. 不能以数字开头。
- 2. 不能以特殊符号开头,可以以"_"开头。
- 3. 推荐字母开头
变量的命名方式:
- 1. 驼峰方式: personOfName personOfAge
- 2. ✔ 现代式: 单词(小写)+ "_下划线"连接 person_of_name
- 3. 。。。。。
- 4. 不要写,不能直接表示含义的变量. a1=lidao a2=oldboy a3=996
环境变量文件加载顺序
位置变量
变量字串
切片
变量扩展-设置默认值
特殊变量小结
变量赋值语句
read参数
4.运算符
运算方法
5.条件表达式
条件表达式符号
判断文件是否存在格式 [ -f /etc/hosts ] ՎҐ echo "成立 " Վҗ echo "失败"
对比字符串
比大小
逻辑判断
小结
案例:
检查
是否输入了用户名。
这个用户是否存在,如果不存在则退出,提示用户不存在。
是否可以登录
用户uid,gid
用户家目录
属于这个用户的文件。
最近1次登录情况。
#1.input## 13 ########## 14 read -p "请输入用户名" user 15 16 ############## 17 #2.检查用户ՎՎ˂ 18 ############## 19 #变量不能为空 20 [ "${user}x" = "x" ] ՎҐ { 21 echo 请输入用户名 22 exit 2 23 } 24 25 #是否存在 26 id $user &>/dev/null 27 if [ $? -ne 0 ];then 28 echo "用户 $user 不存在" 29 exit 1 30 fi 31 #if id $user &>/dev/null ;then 32 # echo "用户 $user 不存在" 33 # exit 1 34 #fi 35 ############## 36 #3.用户信息ՎՎ˂ 37 #登录######### 38 ############## 39 user_shell=`awk -F: -vname=$user '$1Վҧname{print $NF}' /etc/passwd` 40 if [ "$user_shell" = "/bin/bash" ];then 41 if_login="可以登录" 42 else 43 if_login="无法登录" 44 fi 45 46 ############## 47 #3.用户信息ՎՎ˂ 48 #uid,gid###### 49 #家目录####### 50 ############## 51 user_ids=`awk -F: -vname=$user '$1Վҧname{print $3,$4}' /etc/passwd` 52 user_homedir=`awk -F: -vname=$user '$1Վҧname{print $6}' /etc/passwd` 53 54 ############## 55 #3.用户信息ՎՎ˂ 56 #文件 ###### 57 ############## 58 #find / -type f -user oldboy 2>/dev/null 59 60 ############## 61 #3.用户信息ՎՎ˂ 62 #登录 ###### 63 ############## 64 user_login_info=`lastlog |awk -vname=$user '$1Վҧname'` 65 66 67 ############## 68 #4.输出####### 69 ############## 70 cat ՎӒEOF 71 用户名: $user 72 是否可以登录: $if_login 73 用户UID,GID: $user_ids 74 用户家目录: $user_homedir 75 最近的登录情况: $user_login_info 76 用户的文件: `find / -type f -user $user 2>/dev/null` 77 EOF
6.case语句
case语句格式 case "变量" in 1) 命令1 ;; 666) 命令2 ;; 8080) 命令3 ;; *) 错误提示 esac
case语句功能,可以通过if+elif+else形式进行替换。
7.函数
#定义方式01 最完整 function lidao_show() { 命令 命令 内容 return n #函数的返回值 }
函数传参
8.
端口: nc
进程: ps,top
网络: ping
web: curl/wget
检查指定url是否可以访问:wget/curl
9.循环
1 while 条件 2 do 3 命令 4 done
11 #1. vars 0-99之间 12 guess_num=$((RANDOM%100)) 13 i=1 14 #2. 检查是否为数字 15 check_num() { 16 [[ "$num" =~ ^[0-9]+$ ]] Վҗ { 17 echo "请输入数字,不要输入其他$num" 18 continue 19 } 20 } 21 22 #3. 排名功能 23 ranking() { 24 cnt=$((i-1)) 25 if [ $cnt -le 3 ];then 26 echo "恭喜你,使用了$cnt次,超越了99.99%的人" 27 elif [ $cnt -ge 4 -a $cnt -le 6 ];then 28 echo "恭喜你,使用了$cnt次,超越了80%的人" 29 else 30 echo "恭喜你,使用了$cnt次,超越了70%的人" 31 fi 32 } 33 34 #4. 用户输入数字,判断 35 input_num_compare() { 36 read -p "请输入数字" num 37 check_num 38 let iՎҡ 39 if [ $num -gt $guess_num ];then 40 echo "很抱歉,猜大了" 41 elif [ $num -lt $guess_num ];then 42 echo "很抱歉,猜小了" 43 else 44 echo "恭喜你猜对了" 45 ranking 46 exit 47 fi } #5 书写主函数 main() { while true do input_num_compare done } main
failed_cnt=0 #2. 检查是否为数字 # 用户输入非数字 # 1. 检查是否为数字 # 2. 失败次数是否大于等于3 check_num() { [[ "$num" =~ ^[0-9]+$ ]] Վҗ { let failed_cntՎҡ if [ $failed_cnt -lt 3 ];then echo "请输入数字,不要输入其他$num" continue else echo "失败次数过多,游戏结束" exit 1 fi } }
10.数组赋值
11.debug流程
案例:awk循环
awk 'BEGIN{for(i=1;iՎӋ100;iՎҡ) {sum=sum+i} print sum }' awk 'BEGIN{ for(i=1;i<=100;iՎҡ ) {sum=sum+i} print sum }'
awk数组与shell数组区别
- awk数组:关联数组,下标啥都行。
- shell数组:普通数组,下标数字,shell中也有关联数组.。
12.awk和shell语法对比