zoukankan      html  css  js  c++  java
  • Shell编程

    一、第一个shell脚本

    1、什么是shell

    Shell 是操作系统的最外层,Shell 可以合并编程语言以控制进程和文件,以及启动和控制其它程序。shell 通过提示输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出来管理您与操作系统之间的交互。简单来说Shell 就是一个用户跟操作系统之间的一个命令解释器。
    Shell 是用户与 Linux 操作系统之间沟通的桥梁。用户可以输入命令执行,又可以利用 Shell 脚本编程去运行。

    2、shell的种类

    Linux Shell 种类非常多,常见的有:
      Bourne Shell(/usr/bin/sh或/bin/sh)
      Bourne Again Shell(/bin/bash)
      C Shell(/usr/bin/csh)
      K Shell(/usr/bin/ksh)
      Shell for Root(/sbin/sh)等。
    不同的 Shell 语言的语法有所不同,所以不能交换使用

    最常用的shell是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用,也是大多数 Linux 系统默认的 Shell。

    接下来我们来写一个简单的 shell 脚本。(shell 脚本一般文件名以.sh 结尾,同时文件第一行定义该脚本为 shell 脚本)

    3、第一个shell脚本

    执行:vi first_shell.sh
    输入: #
    !/bin/bash #This is my First shell echo "Hello world"
    保存退出,shell脚本写入完成

    输入命令执行:

    编辑模式输入:

    然后执行:

    解释:

    #! /bin/bash           表示定义该脚本是一个 shell 脚本(固定格式)。
    #This is my First shell     这里的#号属于注解,没有任何的意义,shell 不会解析它。
    echo "Hello world"       shell 脚本主命令,我们执行这个脚
    本讲看到: Hello World 信息。
    脚本编写完毕,如何来执行呢,首先执行 shell 脚本需要执行权限,赋予执行权限:chmod o+x first_shell.sh 
    然后执行:./first_shell.sh
    也可以直接使用bash环境命令执行: /bin/sh first_shell.sh,显示效果一样。

    二、shell编程之变量

    1、定义

    Shell 编程语言是非类型的解释型语言,不像 C++/JAVA 语言编程时需要事先声明变量,shell 给一个变量赋值,实际上就是定义了变量,在Linux支持的所有shell中,都可以用赋值符号(=)为变量赋值。SHELL 变量可分为两类:局部变量和环境变量。局部变量只在创建它们的 shell 脚本中使用。而环境变量则可以在创建它们的 shell及其派生出来的任意子进程中使用。有些变量是用户创建的,其他的则是专用 shell 变量。
    例如在脚本里面定义 A=123 ,定义这样一个变量,前面变量名,后面是变量的值。

    2、例子

    引用变量可以使用$A,把变量放在脚本里面会出现什么样的效果呢? 如下

    #!/bin/bash
    #by authors zgs 2020
    name=zgs
    echo "My name is $name"
    执行脚本:sh var.sh,结果将会显示:My name is zgs

    简单的理解变量,相当于定义一个别名-名称,引用的时候加上$符号就可以了。

    shell 常见的系统变量解析:

    $0 :当前程序的名称
    $n :当前程序的第 n 个参数,n=1,2,…9
    $* :当前程序的所有参数(不包括程序本身)
    $# :当前程序的参数个数(不包括程序本身)
    $? :上个命令是否执行成功,0 表示执行成功。不是0表示执行失败
    $UID :当前用户的 ID
    $PWD :当前所在的目录

    例如:

    三、if语句

    1、判断数字大小

    if (表达式) ;then
        语句 1
    else
        语句 2
    fi

    如:

     

    2、判断目录是否存在

    #! /bin/bash
    #auto if test
    #by authors zgs 2020
    
    DIR=/tmp/20200604
    
    if [ ! -d $DIR ];then
            mkdir -p $DIR
            echo -e "33[32mThis $DIR Create success.33[0m"
    else
            echo -e "33[32mThis $DIR is exist, please exit.33[0m"
    fi

     如:

    3、判断文件是否存在

    #! /bin/bash
    #auto test files
    #by authors zgs 2020
    
    FILES=/tmp/text.txt
    
    if [ ! -f $FILES ];then
            echo "OK" >> $FILES
    else
            cat $FILES
    fi

     如:

    逻辑运算符解析:

    -f  判断文件是否存在 eg: if [ -f filename ]
    -d  判断目录是否存在 eg: if [ -d dir ]
    -eq 等于 应用于:整型比较
    -ne 不等于 应用于:整型比较
    -lt 小于 应用于:整型比较
    -gt 大于 应用于:整型比较
    -le 小于或等于 应用于:整型比较
    -ge 大于或等于 应用于:整型比较
    -a  双方都成立(and) 逻辑表达式 –a 逻辑表达式
    -o  单方成立(or) 逻辑表达式 –o 逻辑表达式
    -z  空字符串

    4、多个条件判断

    #! /bin/bash
    #auto test scores
    #by authors zgs 2020
    
    scores=$1   
    
    if [ -z $scores ];then
            echo "usage:{$0 60|80}"
            exit
    fi
    
    if [[ $scores -gt 85 ]]; then
            echo "very good!";
    elif [[ $scores -gt 75 ]]; then
            echo "good!";
    elif [[ $scores -gt 60 ]]; then
            echo "pass!";
    else
            echo "no pass!"
    fi

    如:

    5、if条件语句年写Mysql备份脚本

    6、一键源码安装 LAMP 脚本

    功能:
    打印菜单:
    1)安装 apache WEB 服务器
    2)安装 Mysql DB 服务器
    3)安装 PHP 服务器
    4)整合 LAMP 架构并启动服务
    1、Apache 服务器安装部署。
    下载 httpd-2.2.27.tar.gz 版本,下载 URL,解压,进入安装目录,
    configure;make ;make install
    2、Mysql 服务器的安装。
    下载 mysql-5.5.20.tar.bz2 版本,下载 URL,解压,进入安装目录,
    configure;make ;make install
    3、PHP 服务器安装。
    下载 php-5.3.8.tar.bz2 版本,下载 URL,解压,进入安装目录,
    configure;make ;make install
    4、LAMP 架构的整合和服务启动。

    执行命令:sh auto_lamp1.sh 1,则下载安装Apache

    4、for循环

    for 变量 in 字符串
    do
        语句 1
    done

    案例一:打印 seq 数字循环

    #!/bin/sh
    for i in `seq 15`
    do
      echo 'NUM is $i'
    done

    案例二:求和 1-100 的值

    #!/bin/bash
    #auto sum 1 100
    j=0
    for ((i=1;i<=100;i++))
    do
        j=`expr $i + $j`
    done
    echo $j

    查看脚本执行的过程:

    案例三:找到相关 log,然后批量打包

    #!/bin/sh
    for i in `find /var/log -name '*.log'`
    do
        tar –czf 2014log.tgz $i
    done
    find /var/log -name '*.log':查看指定目录下以log结尾的文件

    如:

    解压:

    案例四:远程主机批量传输文件

    #!/bin/bash
    #auto scp files for client
    #by authorszgs 2020
    for i in `seq 100 200`
    do
        scp -r /tmp/test.txt
        root@192.168.1.$i:/data/webapps/www
    done

    5、while循环

    while 条件语句
    do
        语句 1
    done

    1、案例一:while 条件判断数字

    #!/bin/sh
    i=1;
    while [[ $i -lt 10 ]];do
        echo $i;
        ((i++));
    done;

    案例二:扩展讲解 linux read 命令

    read -p "Please input number:" input

    案例三:while 逐行读取某个文件

    #!/bin/sh
    while read line
    do
        echo $line;
    done < /etc/hosts

    六、until循环

    until 条件 
    do
        action
    done
    直到满足条件,才退出。否则执行 action。

    案例一:条件判断数字

    #!/bin/sh
    a=10;
    until [[ $a -lt 0 ]];do
        echo $a;
        ((a--));
    done;

    如:

    七、case选择语句

    case $arg inpattern1)
        语句 1
        ;;
        pattern2)
    
        语句 2
        ;;
        *)
    
        语句 3
        ;;
    esac

    八、select 选择语句

    select 一般用于选择菜单的创建,可以配合 PS3 来做菜单的打印输出信息。

    #!/bin/sh
    PS3="What you like most of the open source system?"
    select i in CentOS RedHat Ubuntu
    do
        echo "Your Select System: "$i
    Done

    如:

  • 相关阅读:
    AcWing 1135. 新年好 图论 枚举
    uva 10196 将军 模拟
    LeetCode 120. 三角形最小路径和 dp
    LeetCode 350. 两个数组的交集 II 哈希
    LeetCode 174. 地下城游戏 dp
    LeetCode 面试题 16.11.. 跳水板 模拟
    LeetCode 112. 路径总和 递归 树的遍历
    AcWing 1129. 热浪 spfa
    Thymeleaf Javascript 取值
    Thymeleaf Javascript 取值
  • 原文地址:https://www.cnblogs.com/zhangguosheng1121/p/13045785.html
Copyright © 2011-2022 走看看