shell编程是实现linix、UNIX系统管理及自动化运维必备的重要工具,可以把繁琐重复的命令写到shell脚本中执行,节约时间,有效的提高运维人员的工作效率,减少不必要的重复时间

什么是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

版权声明:本文为lzss原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lzss/p/12188850.html