zoukankan      html  css  js  c++  java
  • Linux shell基本使用

    为什么要学习shell编程

    1)Linux运维工程师在进行服务器集群管理时,需要编写shell程序来进行服务器管理。

    2)对于javaEE和python程序员来说,工作的需要,你的老大会要求你编写一些shell脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。

    3)对于大数据程序员来说,需要编写shell程序来管理集群。

    shell是什么

    shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序。

    shell脚本的执行方式

    脚本格式要求:

    1)脚本以#!/bin/bash开头

    2)脚本需要有可执行权限

    编写第一个shell脚本

    需求说明

    创建一个shell脚本,输出hello world!

    脚本的常用执行方式

    方式1(输入脚本的绝对路径或相对路径)

    1)首先要赋予helloworld.sh脚本的+x权限

    2)执行脚本

    方式2(sh+脚本)

    说明:不用赋予脚本+x权限,直接执行即可。

     Shell的变量

    介绍:

    1)Linux Shell中的变量分为 系统变量和用户自定义变量。

    2)系统变量:$HOME、$PWD、$SHELL、$USER等等

    比如:echo $HOME等等。。。

    3)显示当前shell中所有变量:set

    shell变量的定义

    基本语法:

    1)定义变量:变量=值

    2)撤销变量:unset 变量

    3)声明静态变量:readonly变量,注意:静态变量不能unset

    快速入门

    案例1:定义变量A,然后撤销变量A

    案例2:声明静态的变量A=99,不能unset

    案例3:可把变量提升为全局环境变量,可供其他shell程序使用

    shell变量的定义

    定义变量的规则

    1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头。

    2)等号两侧不能有空格

    3)变量名称一般习惯为大写

    将命令的返回值赋给变量(重点)

    1)A=‘ls -la’反引号,运行里面的命令,并把结果返回给变量A

    2)A=$(ls -la)等价于反引号

     

     设置环境变量

    基本语法

    1)export 变量名=变量值(功能描述:将shell变量输出为环境变量)

    2)source配置文件(功能描述:让修改后的配置信息立即生效)

    3)echo $变量名(功能描述:查询环境变量的值)

    快速入门

    1)在/etc/profile文件中定义TOMCAT_HOME 环境变量

    2)查看环境变量TOMCAT_HOME的值

    3)在另外一个shell程序中使用TOMCAT_HOME

    注意:在输出TOMCAT_HOME环境变量前,需要让其生效:  source /etc/profile

    位置参数变量

     介绍:

    当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量

    比如:./myshell.sh 100 200 ,这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息

    基本语法

    $n(功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十及以上的参数需要用大括号包含,如${10}

    $*(功能描述:这个变量代表命令行所有的参数,$*把所有的参数看成一个整体)

    $@(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)

    $#(功能描述:这个变量代表命令行中所有参数的个数)

    案例:

    编写一个shell脚本positionPara.sh,在脚本中获取到命令行的各个参数信息。

     预定义变量

    基本介绍

    就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用

    基本语法

     $$ (功能描述:当前进程的进程号(PID))

    $! (功能描述:后台运行的最后一个进程的进程号(PID))

    $? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

    应用实例

    在一个shell脚本中简单使用一下预定义变量

     

     运算符

    基本介绍

    学习如何在shell中进行各种运算操作

    基本语法

    1)“$((运算式))“或”$[运算式]”

    2)expr m+n

    注意expr运算符间要有空格

    3)expr m-n

    4)expr *,/,% 乘,除,取余

    应用案例

    案例:请求出命令行的两个参数[整数]的和

     

     条件判断

    判断语句

    基本语法

    [ condition ](注意condition 前后有空格)

    #非空返回true,可使用$?验证(0为true,>=1为false)

    应用实例:

    [atguigu]      返回true

    []          返回false

    [ condition ] && echo OK || echo notok 条件满足,执行后面的语句

    常用判断条件

    1)两个整数的比较

    =字符串比较

    -lt小于

    -le小于等于

    -eq等于

    -gt大于

    -ge大于等于

    -ne不等于

    2)按照文件权限进行判断

    -r有读的权限

    -w有写的权限

    -x有执行的权限

    3)按照文件类型进行判断

    -f文件存在并且是一个常规的文件

    -e文件存在

    -d文件存在并是一个目录

    4)应用实例

    案例1:“ok”是否等于“ok”

    判断语句:

    案例2:23是否大于等于22

    判断语句:

    案例3:/root/shell目录中aaa.txt文件是否存在

    判断语句:

     流程控制

    if判断

    基本语法:

    if [ 条件判断式 ];then

      程序

    fi

    或者

    if [ 条件判断式 ]

      then

        程序

      elif [ 条件判断式 ]

        then

          程序

    fi

    案例:请编写一个shell程序,如果输入的参数大于等于60,则输出“及格了”,如果小于60,则输出“不及格”

     

     case语句

    基本语法

    case $变量名 in

      “值1”)

      如果变量的值等于值1,则执行程序1

      ;;

      "值2")

      如果变量的值等于值2,则执行程序2

      ;;

      ...省略其他分支...

      *)

      如果变量的值都不是以上的值,则执行此程序

      ;;

    esac

    应用实例

    案例1:当命令行参数是1时,输出“周一”,是2时,就输出“周二”,其他情况输出“other”

     

    for循环

    基本语法

    for 变量 in 值1 值2 值3...

    do

    程序

    done

    应用实例

    案例1:打印命令行输入的参数[这里可以看出$*和$@的区别]

     

     

    基本语法2

    for ((初始值;循环控制条件;变量变化))

    do

    程序

    done

    应用实例

    案例1:从1加到100的值输出显示

     

     while循环

    基本语法

    while [条件判断式]

    do

    程序

    done

    应用实例

    案例1:从命令行输入一个数n,统计从1+...+n的值是多少?

     

     read读取控制台输入

    基本语法

    read(选项)(参数)

    选项:

    -p:指定读取值时的提示符;

    -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。

    参数:

    变量:指定读取值的变量名

    应用实例:

    案例1:读取控制台输入一个num值

    案例2:读取控制台输入一个num值,在10秒内输入。

     

     

    系统函数

    basename基本语法

    功能:返回完成路径最后/的部分,常用于获取文件名

    basename[pathname][suffix]

    basename[string][suffix]  (功能描述:basename命令会删掉所有的前缀包括最后一个/字符,然后将字符串显示出来)

    选项:suffix为后缀,如果suffix被制定了,basename会将pathname或string中的suffix去掉。

    应用实例

    案例1:请返回 /home/aaa/test.txt 的“test.txt”部分

     dirname基本语法

    功能:返回完成路径最后/的前面的部分,常用于返回路径部分

    应用实例:

    请返回/home/aaa/test.txt 的/home/aaa

     自定义函数:

    基本语法

    [function]funname[()]

    {

      action;

      [return int;]

    }

    调用的话直接写函数名:funname [值]

    应用实例

    案例1:计算输入两个参数的和(用read方式输入)

     

     Shell编程综合案例

    需求分析

    1)每天凌晨2:10备份数据库atguiguDB到 /data/backup/db

    2)备份开始和备份结束能够给出相应的提示信息

    3)备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,比如:2018-03-12_230201.tar.gz

    4)在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。

    #!/bin/bash
    
    #完成数据库的定时备份
    #备份的路径
    BACKUP=/data/backup/db
    #当前的时间作为文件名
    DATETIME=$(date +%Y_%m_%d_%H%M%S)
    #可以数据变量调试
    #echo $DATETIME
    
    echo "============开始备份==========="
    echo "============备份的路径是 $BACKUP/$DATETIME.tar.gz====================="
    
    
    #主机
    HOST=localhost
    #用户名
    DB_USER=root
    #密码
    DB_PWD=123456789
    #备份数据库名
    DATABASE=atguiguDB
    #创建备份的路径
    #如果备份的路径存在,就使用,否则就创建
    [ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
    #mkdir -p :递归创建目录,即使上级目录不存在,会按目录层级自动创建目录
    #执行mysql的备份数据库的指令 mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz #打包备份文件 cd $BACKUP tar -zcvf $DATETIME.tar.gz $DATETIME #删除临时目录 rm -rf $BACKUP/$DATETIME #删除10天前的备份文件 find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} ; echo "==============备份文件成功===================="
  • 相关阅读:
    MFC 按钮
    读写文件
    遍历一个文件夹所有文件
    Java的运行机制
    selenium学习笔记——高级操作
    selenium学习笔记——定位元素
    selenium学习笔记——介绍&环境准备
    搭建安卓系统的测试环境
    Linux下Java环境的安装与配置
    Linux的目录结构介绍
  • 原文地址:https://www.cnblogs.com/wanghaoyu666/p/12024292.html
Copyright © 2011-2022 走看看