zoukankan      html  css  js  c++  java
  • 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

    三 命令

    添加用户:useradd -d /home/damon -m damon

    删除用户:userdel -r -f damon

    "&": 后台运行;

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

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

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

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

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

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

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

    basename 生成路径中的文件名

    dirname 生成路径中的文件夹名

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

    seq 数字:输出从1到数字的所有数字 -w等位补齐 

    grep 内容 文件:过滤出文件中存在内容的地方

    crontab -e 定时执行脚本

    bash -n 脚本名:检测脚本语法

    id user:判断用户是否存在

    command -v 命令名:判断是否存在这个命令

    time 统计程序或脚本的执行时间

    trap "" HUP INT OUIT TSTP:捕捉键盘输入的信号 执行""操作

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

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

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

    ():子shell中之心

    (()):数值比较运算

    {}:集合

    ${}:变量引用

    []:条件测试

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

    $[]:整数运算

    四 Shell通配符

    *  匹配任意多个字符

    ?匹配任意一个字符 

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

    ()  在子shell中执行命令

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

       转义符

    小知识:

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

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

       2. vim中 yy复制当前行,p粘贴到当前光标处 

           dd删除当前行

    五 变量

    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   以调试方式执行,查询整个执行过程

    愿有志之人,成就非凡之事。
  • 相关阅读:
    Linux 下编译hello world 的C 语言程序
    C语言实现二维数组操作--元素个数确定
    Linux Eclipse安装和配置命令行(jre、jdk)
    段错误bug的调试
    fopen与open的区别
    同样的c代码,为何在windows下和linux下执行结果不一样?
    VIM快捷键
    浅谈C中的wprintf和宽字符显示
    Know More About Oracle Row Lock
    【教学视频】Maclean教你一步一步使用Vbox在Linux 5上安装Oracle 11gR2 RAC
  • 原文地址:https://www.cnblogs.com/damon-song/p/13170137.html
Copyright © 2011-2022 走看看