BASH基础

  • shell为Linux提供了编程环境
  • 程序=指令+数据
  • 程序编程式风格
    • 面向过程:以指令为中心,数据服务于命令
    • 面向对象:以数据为中心,命令服务于数据
    • shell是一种过程式编程
  • 过程式编程
    • 顺序执行
    • 循环执行
    • 选择执行
  • shell脚本文件:文本文件#!/bin/bash
  • 运行脚本

    • 给予执行权限,通过具体的文件路径指定文件执行
    • 直接运行解释器,将脚本作为解释器程序的参数运行

      变量

  • 变量命名

    • 命名只能使用英文字母,数字和下划线,首字母不能以数字开头
    • 中间不能够有开头,可以使用下划线
    • 不能使用标点符号
    • 不能使用bash中的关键字
  • 使用变量:$[变量名]
  • 只读变量:readlonly [变量名]
  • 删除变量:unset [变量名]
  • 变量种类
    • 本地变量:生效范围仅为当前shell进程
      • 变量赋值:name=value
    • 环境变量:生效范围为当前shell进程以及子进程
      • 变量声明1:export name=”value”
      • 变量声明2:declare -x name=”value”
      • bash中有很多环境变量:SHELL、PATH等
    • 局部变量:生效范围为当前shell进程中某代码片段(通常指函数)
    • 位置变量:1、2…来表示,让脚本在脚本代码中调用通过命令行传递给它的参数
      • $1, $2对应调用第一,第二个参数
      • $0:命令本身
      • $*:传递给脚本的所有参数
      • $@:传递给脚本的所有参数
      • $#:传递给脚本参数的给叔
    • 特殊变量:? 0 * @ $#
  • shell数组

    • 语法格式:array_name=(用空格分隔)

      环境配置

  • bash配置文件

    • 生效范围分类
      • 全局配置:
        • /etc/bashrc
        • /etc.profile
        • /etc/profile.d/*.sh
      • 个人配置:
        • ~/.bash_profile
        • ~/.bashrc
      • 功能:
        • 用于定义环境变量
        • 运行命令脚本
    • 功能分类
      • profile类:为交互式的shell提供配置
      • bashrc类:为非交互式的shell提供配置
      • 功能:定义变量别名、定义本地变量
    • shell登录
      • 交互式登录:su -USERNAME
        • /etc/profile –> /etc/profile.d/*.sh –> ~/.bash_profile –> ~/.bashrc –> /etc/bashrc
      • 非交互式登录:su USERAME
        • ~/.bashrc –> /etc/bashrc –> /etc/profile.d/*.sh
      • 编辑配置文件定义的新设置的生效方式
        • 重新启动shell进程
        • 使用source命令
    • bash中算数运算符
      • / % ** … 完成算数运算: (1) let var(变量名)=算术表达式 (2) var=$[算术表达式] (3) var=$((算术表达式)) (4) var=$(expr argl arg2 arg3 …) 乘法符号有些场景中需要转义 : \

bash有内建随机数生成器:$RANDOM

增强赋值:

+=,‐=,*=,/=,%=

条件测试

  • bash条件测试
    • 判断某些需求是否满足,需要测试机制来实现
    • 专用的测试表达式需要由命令辅助完成测试过程
  • 测试类型
    • 数值测试
    • 字符串测试
    • 文件测试
  • 数值测试
    • 是否大于:-gt
    • 是否大于等于:-ge
    • 是否等于:-eq
    • 是否不等于:-ne
    • 是否小于:-lt
    • 是否小于等于:-le
  • 字符串测试
    • 是否等于:==
    • 是否大于:>
    • 是否小于:<
    • 是否不等于:!=
    • 左侧的字符串是否能够被右侧字符串匹配:=~
    • 测试字符串是否为空,空则为镇,不空则为假:-z STRING
    • 测试字符串是否为不空,不空则为真,空则为假
  • 文件测试
    • 简单的存在性测试
      • -a:文件存在性测试,存在为真,否则为假
    • 存在性及类型测试
      • -b:是否存在且为快设备文件
      • -c:是否存在且为字符设备文件
      • -d:是否存在且为目录文件
      • -f:是否存在且为普通文件
      • -h或者-L:存在且为符号链接文件
      • -p:是否存在且为命名管道文件
      • -S:是否存在且为套接字文件
    • 文件权限测试
      • -r:是否存在且可读
      • -w:是否存在且可写
      • -x:是否存在且可执行
    • 文件特殊权限测试
      • -g:是否存在且拥有sgid权限
      • -u:是否存在且拥有suid权限
      • -k:是否存在且拥有sticky权限
    • 文件大小测试
      • -s:是否存在且非空
    • 文件是否打开
      • -fd:fd表示文件描述符是否已经打开且与某终端相关
      • -N:文件自从上一次读取过后是否被修改过
      • -O:当前用户是否为文件的属主
      • -G:当前有效用户是否为文件数组
    • 双目测试
      • FILE1 ‐ef FILE2 :FILE1与FILE2是否指向同一个设备上的相同inode
      • FILE1 ‐nt FILE2:FILE1是否新于FILE2
      • FILE1 ‐ot FILE2:FILE1是否旧于FILE2、
  • 组合测试条件

    逻辑运算符:

第一种方式:

  1. COMMAND1 && COMMAND2
  2. COMMAND1 || COMMAND2
  3. ! COMMAND

第二种方式:

   EXPRESSION1 ‐a EXPRESSION2

   EXPRESSION1 ‐o EXPRESSION2  

   ! EXPRESSION

Note:必须使用测试命令进行

  • bash退出状态码

    • 脚本中一旦遇到exit命令,脚本会立即终止,终止退出状态码取决于exit命令后面的数字
    • 如果未给脚本指定退出状态码,整个脚本的退出状态码取决脚本中执行的最后一条命令的状态码

      选择执行

  • 语法

if 判断条件;then
    条件为真的分支代码
elif 判断条件;then
    条件为真的分支代码
else
    条件为假的分支代码
fi

用户交互

  • read命令

    常用选项:

‐a:将内容读入到数组中

echo ‐n “Input muliple values into an array:”

read ‐a array

echo “get ${#array[@]} values in array”

‐d : 表示delimiter,即定界符,例如输入为 hello m,有效值为“hello”,请注意m前面的空格等会被删除

‐e :只用于互相交互的脚本

‐n : 用于限定最多可以有多少字符可以作为有效读入

‐p :用于给出提示符,例如:echo –n “…“来给出提示符,可以使用read –p ‘… my promt?’value的方式只需

一个语句来表示

‐r :特殊字符生效(/n等),也应采用‐r选项。

‐s : 对于一些特殊的符号不打印的情况

‐t :用于表示等待输入的时间(s),等待时间超过,将继续执行后面的脚本

循环语句以及函数

  • for 循环

    for 变量名 in 列表;do
      循环体
    done
    
  • while循环

while 测试条件;do
    循环体
done

经典使用:
#!/bin/bash
while read a;do
    echo $a
done < /datas/6files
语法:
function FUNNAME(){
    函数体
    返回值
}
FUNNME  #调用函数