Shell脚本编程

自古美人都是妖i 提交于 2019-12-15 22:48:37

1 基本介绍

1.1 什么是Shell

  • 是一个用C语言编写的程序,它是用户使用Linux的桥梁
  • 是一种命令语言,又是一种程序设计语言
  • 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务

1.2 什么是Shell Script

  • 是一种为Shell编写的脚本程序

1.3 Shell能做什么

  • 将多个命令写在一起,让用户很轻松的就能执行一个文件的Shell脚本,就能够一次执行多个命令。

2 运行环境

2.1 Shell 环境

  • Bourne Again Shell (/bin/bash)
  • Bourne Shell (/usr/bin/sh或/bin/sh)
  • 只要有一个能编写代码的文本编辑器vi和一个能解释执行的脚本解释器就可以了

2.2 bash环境文件

  • .bash_profile
    • 设置环境变量
    • 账户一建立,该文件就存在
  • .bashrc
    • 存放针对bash的命令
    • .bash_profile之后执行
  • .bash_logout
    • 仅在退出注册时执行
  • .bash_history
    • 历史记录

3 运行基础

3.1 Shell脚本格式

  • 格式:vi 脚本名字.sh
    • 脚本的后缀名可以任意修改,任然可以正常运行
  • 脚本第一行格式:#!/bin/bash
    • 符号#!用来指定该脚本文件的解析程序

3.2 脚本的执行

  • 方式一
    • 先赋予一个执行的权限:chmod +x 脚本文件名字
    • 编译:./脚本文件的名字
  • 方式二
    • /bin/bash 脚本文件的名字

4 编程语法

4.1 变量

  • 变量的声明格式
    • 变量名字=变量值
    • 等号两端不能有空格
  • 变量名的命名规则
    • 首字母为字母
    • 中间不能有空格,可以使用下划线和数字
    • 不能使用标点符号
    • 不能使用bash关键字
  • 使用一个定义过的变量
    • 在变量名前面加$符号即可
    • 变量名外面的花括号时可选的,起帮助解释器识别变量边界的作用
  • 只读变量
    • readonly 变量名
  • 删除变量
    • unset 变量名

4.2 字符串

  • 拼接字符串
  • 获取z字符串长度
    • ${#变量的名字}
  • 提取子字符串
    • ${变量的名字:开始字符下标:截取的长度}
    • 字符串第一个位置下标为0

4.3 数组

  • 数组格式
    • 相当于多个相同类型的变量组成的集合
    • 数组名=(值1 值2 ... 值n)
    • 数字元素用空格隔开
  • 读取数组
    • ${数组名[下标]}
    • 使用@获取数组中的所有元素
  • 获取数组长度
    • 获取数组元素个数:${#数组名[@]}
    • 获取数组单个元素长度:${#数组名[下标]}

4.4 注释

  • "#"开头的行就是注释,会被解释器忽略

4.5 基本运算符

  • 算数运算符

    • expr是一款表达式计算工具,使用它能完成表达式的求值操作
    • 两个数相加(使用的是反引号:``)
    • 运算符与运算值之间必须有空格(运算符两边必须有空格)
    • 使用乘号是前面加上反斜杠:\*
  • 关系运算符

    • -eq:检测两个数是否相等,相等返回true
    • -ne:检测两个数是否相等,不相等返回true
    • -gt:检测左边的数是否大于右边
    • -lt:检测左边的数是否小于右边
    • -ge:检测左边的数是否大于等于右边
    • -le:检测左边的数是否小于等于右边
  • 布尔运算符

    • !:非运算
    • -o:或运算,有一个表达式值为true,则结果为true
    • -a:与运算,只有两个表达式值为true,结果才为true
    • 优先级:!>-a>-o
  • 逻辑运算符

    • &&:逻辑的AND
    • ||:逻辑的OR
  • 字符串运算符

    • =:检测两个字符串是否相等,相等为true $a = $b
    • !=:检测两个字符串长度是否相等,不等为true
    • -z:检测字符串长度是否为0,为0 返回true -z $a
    • -n:检测字符串长度是否为0,不为0 返回true
    • str:检测字符串是否为空,不为空返回true
  • 文件测试运算符

    • -d file:检测文件是否是目录
    • -f file:检测文件是否是普通文件
    • -r file:检测文件是否可读
    • -w file:检测文件是否可写
    • -x file:检测文件是否可执行
    • -s file:检测文件是否为空(文件大小是否为0)
    • -e file:检测文件(包括目录)是否存在
    • file前面加$符号
  • echo命令

    • 格式:echo "字符内容"
    • 转义字符:\进行转义的操作
      • \b:后退
      • \n:换行
      • \t:水平指标符号
      • \\:反斜杠字符
      • \c:不换行
      • 开启转义:e(除转义特殊字符外)
    • read 变量名
      • 从终端输入值,将其分配给该变量
    • echo "It is pushed to the file." > myfile
      • >:把操作结果保存在指定文件中(覆盖操作)
      • >>:追加操作
  • printf命令

    • printf 格式声明 与格式声明相对应的参数列表
    • %d 整数
    • %s 字符串
    • %c 相应参数的第一个字符
    • %f 浮点数
  • test命令

    • 检查某个条件是否成立
    • if test $a -gt 10
  • 数值运算

    • $(())

    • expr ``
  • 条件判断

    • if语句

      • 格式一:

        if [ 判断条件 ](“判断条件"l两边有空格)
        then
          语句块
        fi
      • 格式二

        if [ 判断条件 ]
        then
          语句块1
        else
          语句块2
        fi
      • 格式三

        if [ 判断条件1 ]
        then
          语句块1
        elif [ 判断条件2 ]
        then
          语句块2
        else
          语句块3
        fi
      • case语句

        case $变量名 in
        “第一个变量内容”)
          程序段
          ;;
        “第二个变量内容”)
          程序段
          ;;
        *)
          不包含第一个变量内容和第二个变量内容的其他程序段
          ;;
        esac
  • 循环

    • while...do..done

      while ((判断条件))
      do
          程序段
      done
    • break和continue

      break:跳出所有循环
      continue:让程序跳转到循环开始的地方(判断条件)
    • for...do..done

      • 格式一
      for ((初始值;条件;运算语句))
      do
          程序段
      done
      • 格式二
      for 变量名 in 值1 值2 ...
      do
          程序段
      done
  • 函数

    • 格式一

      function 函数名(){
          函数体
      }
    • 格式二

      函数名(){
          函数体
      }
    • 变量

      • 全局变量:在脚本中,函数外
      • 局部变量:在脚本中,函数内
    • 返回值

      • 在函数体的最后加:return 返回值(整数)
      • 返回值的结果只能通过$?来进行获取
    • 参数传递

      • 通过$n的形式来获取传递过来的参数值(n表示第几个传过来的参数)
      • 当n大于等于10时,格式为${n}
      • $#:参数总数
      • $*:作为一个字符串输出所有参数
    • 递归函数

      • 自己调用自己的函数
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!