什么是 shell
shell 是一个命令解释器, 它在操作系统的最外层, 负责直接与用户对话, 把用户的输入解释给操作系统, 并处理各种各样的操作系统的输出结果, 输出屏幕返回给用户
shell 对话方式
交互的方式: 从键盘输入命令, 通过 / bin/bash 的解析, 可以立即得到 shell 的回应, 一问一答的方式
非交互式: shell 脚本
为什么使用 shell 编程!
shell 编程是实现 linix,UNIX 系统管理及自动化运维必备的重要工具, 可以把繁琐重复的命令写到 shell 脚本中执行, 节约时间, 有效的提高运维人员的工作效率, 减少不必要的重复时间
变量
普通变量 (局部变量)
- ip = 192.168.22.205
- echo $ip
环境变量 (全局变量)
大写, 系统定义的, 在大部分地方可以使用
特殊变量
$1 $2 $ 数字 $ 后数字是几代表 shell 脚本第几个参数
$# shell 脚本中参数的个数, 判断脚本的参数个数
$? 上一个命令的执行结果 (返回值)0 执行正确 1 相反
$0 脚本文件名
shell 脚本的书写规范
脚本一般存放在 / server/scripts / 中
脚本编辑使用 VIM
在执行 bash 脚本的时候, 一般会根据 "#!" 后的解释器来确定该用那个程序解释这个脚本
脚本文件名一般以. sh 结尾
数学计算方法
- # awk -v 变量 = 赋值 变量名称自己定义
- awk 'BEGIN{print 1/2}'
书写脚本 10 与 20 的加减乘除
- #VIM cal.sh
- #!/bin/bash
- n1=10
- n2=20
- awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1+num2}'
- awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1+num2}'
- awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1*num2}'
- awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1/num2}'
执行脚本
# sh cal.sh
定义特殊变量, 通过命令行传递参数方式
- # VIM cal.sh
- #!/bin/bash
- n1=$1
- n2=$2
- awk -vnum1=$1 -vnum2=$2 'BEGIN{print num1+num2}'
- awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1+num2}'
- awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1*num2}'
- awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1/num2}'
执行脚本
# sh cal.sh 10 20 后面要加上两个参数, 参数之前加空格
read 交互式
read 交互式赋予变量内容
read -p "提示信息" 变量, 变量名字, 执行结束会把输入的信息存放在变量中
- # read -p "input num1:"n1
- imput num1:sgs
- #echo $n1
- sgs
通过 read 命令实现 n1,n2 赋值进行计算
- #VIM cal.read.sh
- #!/bin/bash
- read -p "input num1,num2:"n1 n2
- awk -vnum1=$1 -vnum2=$n2'BEGIN{print num1+num2}'
- awk -vnum1=$1 -vnum2=$n2'BEGIN{printnum1-num2}'
- awk -vnum1=$1 -vnum2=$n2'BEGIN{print num1*num2}'
- awk -vnum1=$1 -vnum2=$n2'BEGIN{print num1/num2}'
执行脚本
- # sh cal.read.sh
- input num1,num2:10 20 #随便输入两个数值, 中间要有空格
条件表达式 if
[ -d/data ] 判断目录是否存在
[ -f/data ] 判断文件是否存在
注意格式:[空格 - f/data 空格],[] 里面两端必须有空格, 中间写内容
比大小
- -eq equal ==
- -ne not equal !=
- -gt great than>
- -ge great equal>=
- -lt Less than <-le Less equal <=
- eg:[ 10 -eq 10]
if 单分支格式脚本
格式: if[条件];then
命令
- fi
- #!/bin/bash
- if [ $# -ne 2];then
- echo "输入两个数字"
- fi
if 双分支格式脚本
格式: if[条件];then
命令
else
命令
fi
comp.sh 输入两个数字, 如果 n1 大于 n2 输出 n1>n2, 如果 n1 不大于 n2 输出 n1<=n2
- #!/bin/bash
- n1=$1
- n2=$2
- if [ $n1 -gt $2];then
- echo "$n1> $n2"
- else
- echo "$n1 <= $n2"
- fi
case 选择分支
case $ 变量名 in
'值 1')
代码
;;
'值 2')
代码
;;
*)
代码
- ;;
- esac
- #!/bin/bash
- read -p "press some key,then press return:"KEY
- case $KEY in
- [a-z]|[A-Z]
- echo "it's a letter"
- ;;
- [0-9])
- echo "it's a digit"
- ;;
- echo "it's function keys,Spacebar or other ksys"
for 循环
for 变量 in 值 1 值 2 值 3
do
代码
done
for 变量 ` 命令 `
do
程序块
- do done
- for((初始值; 循环控制; 变量变化))
- do
程序块
- done
- # 输出 3 次 uptime
- #!/bin/bash
- for i in 1,2,3,4,5
- do
- echo "$i-->$(uptime)"
- done
- # 批量解压缩当前文件夹下所有的. tar.gz 文件
- #!/bin/bash
- for i in `ls./*.tar.gz`
- do
- tar -zxvf $i>/dev/null
- done
- # 求 1~100 的和
- #!/bin/bash
- sum=0 #变量赋值的时候,= 两边绝对不能有空格
- for ((i=1;i<=100;i++))
- do
- sum=$(($sum+$i))
- done
- echo "1+2+3+...+100=$100"
while 循环
while [条件]
do
代码
- done
- #!/bin/bash
- a=1
- while [ $a -le 5 ]
- do
- echo $a
- ((a++))
- done
- #!/bin/bash
- a=1
- while((a<=5))
- do
- echo $a
- ((a++))
- done
来源: http://www.bubuko.com/infodetail-3379088.html