- Shell 编程介绍
- Shell 脚本介绍
- Shell 是一种脚本语言。
- 可以使用逻辑判断、循环等语法。
- 可以自定义函数。
- Shell 是系统命令的集合。
- Shell 脚本可以实现自动化运维,能大大增加我们的运维效率。
- Shell 脚本结构和执行方法
- 开头需要加#!/bin/bash
- 以#开头的行为作为解释说明。
- 脚本的名字以.sh 结尾,用于区分这是一个 shell 脚本。
- 执行方法有两种。
- chmod +x 1.sh; ./1.sh
- bash 1.sh
- 查看脚本执行过程 bash -x 1.sh
- 查看脚本是否语法错误 bash -n 1.sh
- date 命令用法
- date +%Y-%m-%d,date +%y-%m-%d 年 月 日
- (Y 四位数,y 两位数,m 月份,M 分钟,d 日期,D 显示为日/月/年,S 秒,s 时间戳,w
- 星期几,W 显示当前是今年的第几周,cal 显示日历)
- date +%H:%M:%S = date +% T 时间
- date +%s 时间戳
- date -d @1504620492
- date -d “+1 day” 一天后
- date -d “-1 dat” 一天前
- date -d “-1 month” 一月前
- date -d “-1 min” 一分钟前
- date +%w,date +%W 星期
- 当脚本中使用某个字符串比较频繁并且字符串长度很长是就应该使用变量代替。
- 使用条件语句时,常使用变量 if[ $a -gt 1]; then ... ; fi
- 引用某个命令的结果时,用变量替代 n=’wc -l 1.txt’ 写和用户交互的脚本时,变量也是必不可少的 read -p “lnput a number:” n; echo $n 如果没写
- 这个 n,可以直接使用$REPLY 。
- 内置变量$0,$1,$2... $0 表示脚本本身,$1 第一个参数,$2 第二个 ... $#表示参数个数。
- 数学运算 a=1;b=2;c=$(($a+$b))或者$[$a+$b] 。
- Shell 脚本中的逻辑判断
- 格式 1:if 条件;then 语句;fi
- 格式 2:if 条件;then 语句;else 语句;fi
- 格式 3:if ...;then ...;elif ...;then ...;else ...;fi
- 逻辑判断表达式:if [ $a -gt $b ];if [ $a -lt 5 ];if [ $b -eq 10 ]等
- -gt(>);-lt(<);-ge(>=);-le(<=);-eq(==);-ne(!=)注意到处都是空格。
- 可以使用&& | |结合多个条件。
- if[$a -gt 5] && [$a -lt 10];then
- if[$b -gt 5] || [$b -lt 3];then
- if 判断文件、目录属性
- [ -f file ]判断是否是普通文件,且存在。
- [ -d file ]判断是否是目录,且存在。
- [ -e file ]判断文件或目录是否存在。
- [ -r file ]判断文件是否可读。
- [ -w file ]判断文件是否可写。
- [ -x file ]判断文件是否可执行。
- if 特殊用法
- if [ -z “$a” ]这个表示当变量 a 的值为空时会怎么样。
- if [ -n “$a” ]表示当变量 a 的值不为空。
- if grep -q ‘123’ 1.txt;then 表示如果 1.txt 中含有’123’的行时会怎么样。
- if [ ! -e file ];then 表示文件不存在时会怎么样。
- if (($a<1));then ... 等同于 if [$a -lt 1 ];then ... [ ]中不能使用<,>,==,!=,>=,<=这样的符号。
- case 判断
- 格式 case 变量名 in
- value1)
- command
- ;;
- value2)
- command
- ;; *)
- commond
- ;;
- esac
- 在 case 程序中,可以在条件中使用|,表示或的意思,比如
- 2|3)
- command
- ;;
- Shell 脚本案例
- #!/bin/bash
- read -p “please input a number:” n
- if [ -z “$n” ]
- then
- echo “please input a number.” exit 1
- fi
- n1=’echo $n|sed’s/[0-9]//g”
- if [ ! -z $n1 ]
- then
- echo “please input a number.” exit 1
- #elif [$n -lt 0 ] || [ $n -gt 100 ]
- #then
-
echo “The number range is 0-100.” # exit 1
- fi
- if [ $n -lt 60 ] && [ $n -ge 0 ]
- then
- tag=1
- elif [ $n -lt 60 ] && [ $n -lt 80 ]
- then
- tag=2
- elif [ $n -ge 80 ] && [ $n -lt 90 ]
- then
- tag=3
- elif [ $n -ge 90 ] && [ $n -le 100 ]
- then
- tag=4
- else
- tag=0
- fi
- case $tag in
-
- echo ”不及格”
- ;;
-
- echo ”及格”
- ;;
- 3|4)
- echo ”优秀”
- ;;*)
- echo “The number range is 0-100.”
- ;;
- esac
- for 循环
- 语法:for 变量名 in 条件;do ...;done
- 案例 1
- #!/bin/bash
- sum=0
- for i in ‘seq 1 100’ do
- sum=$[$sum+$i]
- echo $i
- done
- echo $sum
- 案例 2
- 文件列表循环
- #!/bin/bash
- cd /etc/
- for a in ‘ls /etc/’ do
- if [ -d $a ]
- then
- ls -d $a
- fi
- done
- While 循环
- 语法 while 条件;do ...;done
- 案例 1
- #!/bin/bash
- whule :
- do
- load=’w|head -1|awk -F ‘load average:’’{print $2}’|cut -d.-f1’
- if [ $load -gt 10 ]
- then
- top|mail -s “load is high:$load”asldkfls@11.com
-
/usr/local/sbin/mail.py xxx@qq.com “load high” “$load”
- fi
- sleep 30
- done
- 案例 2
- #!/bin/bash
- while :
- do
- read -p “please input a number:” n
- if [ -z “$n” ]
- then
- echo “you need input sth.” continue
- fi
- n1=’echo $n|sed ‘s/[ 0-9 ]//g’
- if [ -n “$n1” ]
- then
- echo “you just only input numbers.” continue
- fi
- break
- done
- echo $n
- break 跳出循环
- #!/bin/bash
- for i in ‘seq 1 5’ do
- echo $i
- if [ $i -eq 3 ]
- #(当比较的是字符串是可以使用==,比较数字也可以使用==但是不够严谨)
- then
- break
- fi
- echo $i
- done
- echo aaaaaa
- continue 结束本次循环
- 忽略 continue 之下的代码,直接进行下一次循环。
- #!/bin/bash
- for i in ‘seq 1 5’ do
- echo $i
- if [ $i -eq 3 ]
- then
- continue
- fi
- echo $i
- done
- echo $i
- exit 退出整个脚本
- #!/bin/bash
- for i in ‘seq 1 5’ do
- echo $i
- if [ $i -eq 3 ]
- then
- exit
- fi
- echo $i
- done
- echo aaaaaaa