Shell 脚本学习(1)

一 Shell概览

1. 自动化批量系统初始化程序(update, 软件安装,时区设置,安全策略,...)

2. 自动化批量软件部署程序(LAMP,LNMP,Tomcat,LVS,Nginx)

3. 应用管理程序(KVM,集群管理扩容,MySQL)

4. 日志分析处理程序(PV,UV,200,!200,top 100, grep/awk)

5. 自动化备份恢复程序(MySQL完全备份/增量+Crond)

6. 自动化管理程序(批量远程修改密码,软件升级,配置更新)

7. 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)

8. 配合Zabbix信息采集

9. 自动化扩容(增加云主机——>部署应用,业务上线)

10. Shell可以做任何事

二 小程序

1

#!/bin/bash
ping -c1 www.baidu.com $>/dev/null && echo "success" || echo "failed" 

"#!":linux系统官方称呼为Shebang,用来给当前脚本定义默认解释器的。

"$>" : 将结果重定向。(标准输出1,错误输出2)

"&&":前面的命令的返回值为0(即成功),则执行其后命令。

"||":前面的命令返回值为1(即失败),则执行其后命令

2

#!/usr/bin/bash
#如果用户没加参数
if [ $# -eq 0 ];then  #-le 小于等于
    echo "usage: `basename $0` file"
    exit
fi
#如果用户输入的参数不是文件
if [ ! -f $1 ];hen
    ehco "error file!"
    exit
fi

for ip in `cat $1`
do
    ping -c1 $ip &>/dev/null
    if [ $? -eq 0 ];then
        echo "$ip success"
    else
        echo "$ip failed"
    fi
done

 3

read -p "Please input a number: " num

while true
do
    if [[ "$num" =~ ^[0-9]+$ ]];then #判断输入的是否是数字
        break;
    else
        read -p "Please input a number: " num
    fi
done

 

三 命令

"&": 后台运行;

但后台运行后,关掉终端后程序会关掉。

"nohup"允许后台运行的程序,在关掉终端后还可以运行。

"bg"查看后台进程;"fg"查看前台进程

连贯动作:"ctrl+z"后台执行,"bg"返回前台

kill 3 杀死PID为3的进程;kill %3 给当前终端进程号为3的作业发信号

true永远返回真,false命令永远返回假,$?查看上一条命令返回值

";"只是将一行上的两个命令分开。

basename 生成路径中的文件名

dirname 生成路径中的文件夹名

bash -vs shell脚本:调试执行脚本

seq 数字:输出从1到数字的所有数字

" ":双引号是弱引用,里面变量会被替换

‘ ’:单引号是强引用,里面变量不会被替换,就是字符串

` `反引号 命令替换 等价于$() 反引号中的命令会先被执行

():子shell中之心

(()):数值比较运算

{}:集合

${}:变量引用

[]:条件测试

[[]]:条件测试,支持正则 [[ =~ ]]

$[]:整数运算

四 Shell通配符

*  匹配任意多个字符

?匹配任意一个字符 

[]  匹配方括号中任意一个字符 [^] 匹配任意非括号中字符

()  在子shell中执行命令

{}  集合 mkdir {1.txt,2txt} 创建1.txt和2.txt文件   

\   转义符

小知识:

  echo -e "\e[1;31mhello" 显示的hello为红色(31m),前景色的数字30-37,后景色的数字40-47

  printf "hello %b" damon 格式化输出 hello damon

五 变量

shell中变量都是字符串

1.自定义变量(C语言中的局部变量)

定义变量: 变量名=变量值 变量名命名规范和c语言一致;

                   read 变量名 :表示从键盘读入;

                   read -p "Please input a name: " `name :加提示从键盘读入

引用变量: %变量名 或 ${变量名}; ${#变量名}:变量名长度

查看变量:echo $变量名 set(所有变量:包括自定义变量和环境变量)

取消变量:unset变量名

作用范围:仅在当前shell中有效

2.环境变量(C语言中的全局变量)

 定义环境变量:方法一 export v1 = /home/backup 

         方法二 export v2 将自定义变量转换成环境变量

 引用环境变量:$变量名 或${变量名}

 查看环境变量:echo $变量名 或者 env 例如 env |grep v1

 取消环境变量:unset变量名

 变量作用范围:在当前shell和子shell有效

一般我们自己不定义

3.位置变量

$1 $2 $3 $4....

4.预定义变量

$0 脚本名

$* 所有的参数

$@ 所有的参数

$# 所有参数的个数

$$ 当前进程的PID

$! 上一个后台进程的PID

$? 上一个命令的返回值(0便是成功)

六 变量的运算

1.整数运算

方法一:expr 1 + 2     + - \* / %

方法二:$((1 + 2))      + - * / %

方法三:$[1+2]           + - * / %

方法四:let; let num = 1 + 2; echo $sum

2.小数运算

echo "2*4" |bc

echo "2^4" |bc

echo "scale=2;6/4" |bc

awk 'BEGIN{print 1/2}'

echo "printf 5.0/2" |python

3.变量内容的删除和替换

url=www.baidu,com.cn
echo ${#url} #显示 变量长度
echo ${url#*.} #显示 变量从前往后删除到第一个点的后的字符串
echo ${url##*.} #显示 变量从前往后删除到最后一个点后的字符串
echo ${url%.*} #显示 变量从后往前删除到第一个点后的字符串
echo ${url%%.*} #显示 变量从后往前删除到最后一个点后的字符串

#变量切片
echo ${url:0:5} #显示 从第0位数5为的字符串
echo ${url:3} #显示 从第3位到最后的字符串

#变量内容替换
echo ${url/sina/baidu} #显示 将sina替换成baidu的字符串
echo ${url//n/N} #显示 将所有m替换成N的字符串

#变量的替代
${变量名-新的变量值}
变量没有被定义:会使用“新的变量值”替代
变量有被定义:不会被替代

${变量名:-新的变量值}
变量没有被定义或者被定义但是空值:会使用“新的变量值”替代
变量有被定义且不为空值:不会被替代
${变量名+新的变量值}
变量没有被定义:不会被替代
变量有被定义:会被新值替代
${变量名:+新的变量值}
变量没有被定义或值为空:不会被替代
变量有被定义且值不为空:会被新值替代

${变量名=新的变量值}
变量被定义且值为空:不会被替代
变量没有被定义或值不为空:会被新值替代

${变量名:=新的变量值}
变量没有被定义或值为空:会被替代
变量有被定义且值不为空:不会被新值替代

七 执行脚本

./test.sh            需要执行权限 在子shell中执行

bash test.sh     不需要执行权限 在子shell中执行

. test.sh            不需要执行权限 在当前shell中执行

source test.sh  不需要执行权限 在当前shell中执行

提示:通常修改系统配置文件如/etc/profile 的 PATH等变量后,使之在当前shell中执行

sh -n test.sh     仅调试syntax error

sh -vx test.sh   以调试方式执行,查询整个执行过程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章