Bash 基础特性及shell编程基础

Bash内置基本变量

  1. PWD : 显示当前的工作目录
  2. OLDPWD : 显示上一次的工作目录
  3. ~:用户家目录
  4. - : 使用cd -命令可以在上一次工作目录和当前工作目录中来回切换
  5. HISTSIZE : 显示shell中历史命令保留数量
  6. HISTFILE : 显示历史命令文件存放路径
  7. HISTFILESIZE : 显示历史命令文件存放命令数量
  8. HISTCONTROL : 显示历史命令记录方式
    • ignoredups : 让历史命令保存方式为『不记录连续重复命令』
    • ignorespace: 让历史命令保存方式为「不记录以空格开头的命令」
    • ignoreboth : 以上两个皆有
  9. !# : 代表执行历史记录中#号命令
  10. !! : 执行上一次历史命令
  11. Esc,. : 提取上一次命令最后一个参数
  12. !$ : 提取上一次命令最后一个参数
  13. PATH : 环境变量
  14. $? : 上一次命令的执行状态结果
  15. SHELL : 当前shell
  16. home : 家目录路径
  17. UID : 用户的UID
  18. GID : 用户的GID
  19. USER: 用户名

bash特性之命令行展开

  1. ~ : 自动展开为用户家目录
  2. {} :中间以多个" , "号为分隔,依次展开为多个数量

bash特性之执行状态结果

  1. 成功 == 0
  2. 失败 == 1-255

bash特性之命令结果引用

  1. `COMMAND`
  2. $(COMMAND)

bash特性之引用

  1. 转义:用反斜杠在需要转义的字符前,表示这个字符需要看作一个普通字符
  2. 强引用:使用” ` “把所有内容都引起来,``号中的所有内容都看作为普通字符,除了引号自身,所以不要在``号内再加``号
  3. 弱引用:使用” “把内容都引起来,除了引号自身,把大部分字符都看作普通字符,例外的有 ,$ , ` ,三个特殊字符

bash特性之元字符

  1. * : 任意长度的任意字符
  2. ? : 单个字符
  3. [] : 指定范围内的任意字符
  4. [^] : 指定范围外的任意字符
    • 特殊格式
      • [a-z]:任意字母(glob中不分大小写)
      • [0-9]:任意一个数字
      • [a-z0-9]:任意一个数字和字母
      • [:alpha:] :大写及字母
      • [:upper:] :大写字母
      • [:lower:] :小写字母
      • [:digit:] :数字
      • [:alnum:] :数字和字母
      • [:space:] :空白(包含空格和制表格)
      • [:punct:]:标点符号

bash特性之hash

缓存之前命令查找的结果,就叫命令hash,也叫命令缓存,可以使用hash命令查看其缓存的命令的完事路径及命中的次数。

  • hash

    options:

      -d [COMMAND] :清除指定的缓存命令
      -r : 清空hash表
    

===============

shell编程基础

shell编程之变量

什么是变量?
内存空间地址+数据,数据是放在内存中,即也叫有名称的内存地址
变量的值的类型,决定了存储格式、表示的数据范围、参与的运算
变量赋值
`name=VALUE`
bash对变量的机制
  1. 所有都看作字符型
  2. 不支持浮点数据,需借用外部机制
  3. 变量无需事先申明,相当于,赋值和申明同时实现
程序中变量引用的机制
把变量名出现的位置,直接替换为其所指向的内存空间中的数据
变量的命名规范
  1. 不能以数字开头,只能包含数字、字母、下划线
  2. 变量名要做到见名知义
  3. 不能使用程序语言的保留字(if else where等)
变量的引用
  1. ${var_name}
  2. $var_name
变量的类型
  1. 本地变量:作用范围仅为当前shell;
  2. 环境变量:作用范围当前进程和其子进程
  3. 局部变量:作用范围为某片代码片;
  4. 特殊变量:shell内置的,有特殊功用
    • 0 = 成功
    • 1-255 = 失败
各变量的赋值、引用 、查看、删除
本地变量
  • 变量的定义
    • var_name=VALUE
  • 变量的引用
    • ${var_name} ,$name
  • 变量的查看
    • set
  • 变量的撤消
    • unset var_name (此次不需要加$)
环境变量
  • 变量的定义

    • export var_name=value
    • var_name=value --> export var_name
    • declare -x var_name=VALUE (-x 表示定义为一个环境变量)
      • declare -i var_name=VALUE (直接将var_name定义为整形)
  • 变量的引用

    • ${var_name} $var_name
  • 变量的查看

    • export
    • declare -x
    • printenv
    • env
  • 变量的撤消

    • unset var_name
只读变量的定义
  • declare -r var_name=VALUE (只读变量只有进程结果后才会消息,如果定义在环境配置文件中,需要手动清除)
  • readonly name
增强型变量赋值
  • i=1
  • i=$[$i+1]
  • let i+=1
  • let i+=2
变量做某种运算后存至变量中
  • let i=$i+# 等同 let i+=#
    • +=, -=, *=, /=, %= 都需要使用let命令进行描述
  • 变量的自增
    var=$[$var+1] == let var+=1 == let var++
  • 变量的自减
    var=$[$var-1] == let var-=1 == let var--

=============

bash之切片

基于字符串切片

Usage: ${var:offset: length}

例:
    [root@localhost ~]#mypath="/etc/sysconfig/network-scripts/"    #定义一个变量,等会切这个变量
    [root@localhost ~]# echo ${mypath:5}       #偏移5个字符显示
    sysconfig/network-scripts/
    [root@localhost ~]# echo ${mypath:10}     #偏移10个字符显示
    nfig/network-scripts/
    [root@localhost ~]# echo ${mypath:5:5}    #偏移5个字符,取5个字符 
    sysco   
    
    取出字符串的最后几个字符:${var: -length}
        注意:-length之前有空白字符;
    [root@localhost ~]# echo ${mypath: -10}
    k-scripts/
基于模式取子串
  • Usage:
    1. ${var#*word}:自左而右,查找var变量中存储的字符串中第一次出现的由word所指明的字符,删除字符及其左侧的所有内容
    2. ${var##*word}:自左而右,查找var变量中存储的字符串中最后一次出现的由word所指明的字符,删除字符及其左侧的所有内容
    3. ${var%word*}:自右而左,查找var变量中存储的字符串中第一次出现的由word所指明的字符,删除字符及其右侧的所有内容
    4. ${var%%word*}:自右而左,查找var变量中存储的字符串中最后一次出现的由word所指明的字符,删除此字符及其右侧的所有内容
示例:
    [root@localhost ~]#mypath="/etc/sysconfig/network-scripts"
    [root@localhost ~]# echo ${mypath#*/}
    etc/sysconfig/network-scripts
    
    [root@localhost ~]#mypath="/etc/sysconfig/network-scripts"
    [root@localhost ~]# echo ${mypath##*/}
    network-scripts
    
    [root@localhost ~]#mypath="/etc/sysconfig/network-scripts"
    [root@localhost ~]# echo ${mypath%c*}
    /etc/sysconfig/network-s
    [root@localhost ~]# echo ${mypath%%c*}
    /et
基于字串查找替换
  • Usage:
    1. ${var/pattern/replacement} :查找var变量存储的字符中第一次由pattern匹配到的内容,并替换为replacement
    2. ${var//pattern/replacement} :查找var变量存储的字符中所有能够由pattern匹配到的内容,并替换为replacement
    3. ${var/#pattern/replacement} :查找var变量存储的字符中最开始处能够由pattern匹配到的内容,并替换为replacement
    4. ${var/%pattern/replacement} : 查找var变量存储的字符中最后位置能够由pattern匹配到的内容,并替换为replacement
示例:
    [root@localhost ~]#url="http://www.baidu.com:80"
    [root@localhost ~]# echo ${url/www/WWW}
    http://WWW.baidu.com:80
    [root@localhost ~]# echo ${url/w/W}
    http://Www.baidu.com:80
    
    [root@localhost ~]# echo ${url//w/W}
    http://WWW.baidu.com:80
    
    [root@localhost ~]# userinfo="root:x:0:0:rootuser:/root:/bin/bash"
    [root@localhost ~]# echo ${userinfo/#root/ROOT}
    ROOT:x:0:0:root user:/root:/bin/bash
    
    [root@localhost ~]# userinfo="root:x:0:0:rootuser:/root:/bin/root"
    [root@localhost ~]# echo ${userinfo/%root/ROOT}
    root:x:0:0:root user:/root:/bin/ROOT
基于字串查找删除
  • Usage:
    1. ${var/pattern}:查找var变量存储的字符中第一次由pattern匹配到的内容,并删除;
    2. ${var//pattern}:查找var变量存储的字符中所有能够由pattern匹配到的内容,并删除;
    3. ${var/#pattern}:查找var变量存储的字符中最开始处能够由pattern匹配到的内容,并删除;
    4. ${var/%pattern}:查找var变量存储的字符中最后位置能够由pattern匹配到的内容,并删除;
示例:
[root@localhost ~]# userinfo="root:x:0:0:rootuser:/root:/bin/root"
[root@localhost ~]# echo ${userinfo/root}
:x:0:0:root user:/root:/bin/root
[root@localhost ~]# echo ${userinfo//root}
:x:0:0: user:/:/bin/
[root@localhost ~]# echo ${userinfo/#root}
:x:0:0:root user:/root:/bin/root
[root@localhost ~]# echo ${userinfo/%root}
root:x:0:0:root user:/root:/bin/
基于字符串大小写转换
  • Usage:
    1. ${var^^}:把var变量中的所有小写字母,统统替换为大写;
    2. ${var,,}:把var变量中的所有大写字母,统统替换为小写;
示例
[root@localhost ~]# echo $userinfo
root:x:0:0:root user:/root:/bin/root
[root@localhost ~]# myinfo=${userinfo^^}
[root@localhost ~]# echo $myinfo
ROOT:X:0:0:ROOT USER:/ROOT:/BIN/ROOT
[root@localhost ~]# echo ${myinfo,,}
root:x:0:0:root user:/root:/bin/root

空变量判断赋值

  • Usage:
    1. ${var:-word}:如果变量var为空或未声明,则返回word所表示的字符串;否则,则返回var变量的值, 临时赋值

       [root@localhost ~]# echo $name
                     #这行的值为空
       [root@localhost ~]# echo ${name:-tom}
       tom
       [root@localhost ~]# name=hello 
       [root@localhost ~]# echo ${name:-tom}           hello
      
    2. ${var:=word}:如果变量var为空或未声明,则返回word所表示的字符串,并且把word赋值为var变量;否则,则返回var变量的值,直接等值

       [root@localhost ~]# echo $name
                   #这行的值为空
       [root@localhost ~]# name=${name:-tom}
       [root@localhost ~]# echo $name
       tom
       [root@localhost ~]# name=${name:-jerry}
       [root@localhost ~]# echo $name
       tom
      
    3. ${var:?error}:如果变量var为空或未声明,则返回error为错误信息;否则,则返回var变量的值;

       [root@localhost ~]# echo "User's name is${name:?wrong}"
       -bash: name: wrong
       [root@localhost ~]# name=tom
       [root@localhost ~]# echo "User's name is${name:?wrong}"
       User's name is tom
      
    4. ${var:+word}:如果变量var为空或未声明,忽略;否则,则返回word;

       [root@localhost ~]# unset name
       [root@localhost ~]# echo "User's name is${name:+wrong}"
       User's name is 
       [root@localhost ~]# name=tom
       [root@localhost ~]# echo "User's name is${name:+wrong}"
       User's name is wrong
      

===============

bash多命令执行

  1. 无逻辑关系的

    • COMMAND1;COMMAND2;COMMAND3...
  2. 有逻辑关系的

    • 逻辑的运算结果状态:

      • (True ,1
      • (False ,0
    • 与运算(乘法)

      • 1&&1=1
      • 1&&0=0
      • 0&&1=0
      • 0&&0=0
        • 只有两个都为真,结果才为真,否则为假(遵守短路法则)
    • 或运算 :加法

      • 1 || 0 = 1
      • 1 || 1 = 1
      • 0 || 1 = 1
      • 0 || 0 = 0
        • 只要一个为真,即为真,(类似电路并链)
    • 非:取反

      • ! 1 = 0
      • ! 0 = 1
    • 异或:判断是否不同

      • 不同者为真,相同者为零假
短路法则:
#COMMAND1 && COMMAND2 : 
    COMMAND1为『假』,COMMAND2不会再执行,
    COMMAND1为『真』,COMMAND2必须执行
#COMMAND1 || COMMAND2
    COMMAND1为『真』;COMMAND2不会执行
    COMMAND1为『假』;COMMAND2必须执行
    例:# id $username || useradd $username

bash的配置文件

1、bash配置文件的分类
  • profile类:为交互式shell提供配置文件
    • 全局配置
      • /etc/profile
      • /etc/profile.d/*.sh
    • 用户个人
      • ~/.bash_profile
  • bashrc类: 为非交互式用户提供配置文件
    • 全局配置
      • /etc/bashrc
    • 用户个人
      • ~/.bashrc
2、profile、bashrc类的功用
  • profile类
    • 定义用户的全局变量
    • 运行命令和脚本
  • bashrc类
    • 定义本地变量
    • 定义别名
3、登录式shell、非登录shell读取配置文件的顺序
  1. 登录式shell读取顺序
    • /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
  2. 非登录式shell读取顺序
    • ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
4、让定义的配置文件立即生效
  • source /PATH/TO/PROFILE
  • . /PATH/TO/PROFILE
注意: 需要定义全局的别名,需修改/etc/bashrc文件

bash之算术运算

  1. let命令

    • let SUM=$num1+$num2
    • echo $SUM
  2. 算术运算表达式一:

    • echo $[ $num1 + $num2 ]
  3. 算术运算表达式二:

    • echo $(($num1 + $num2))
  4. 算术运算表达式三:

    • expr $num1 + $num2
  5. bash的运算符

    • + - * / ** %
注意:乘法符号在有些场景中使用需要加转义符

Bash之条件测试:

判断某需求是否满足,需要由测试机制来实现

1. 使用执行命令,并利用命令状态返回值来判断

  • 0:成功,
  • 1-255:失败

2. 测试表达式格式

  • test expression
  • [ expression ] :括号前后两端必须有空格,否则为语法错误
  • [[ expression ]] :括号前后两端必须有空格,否则为语法错误, 多为测试字符串

bash的测试类型:

  1. 数据测试
    • 数值比较
      • -eq : 是否等;[ $nu1 -eq $num2 ]
      • -ne : 是否不等于;
      • -gt : 是否大于
      • -ge : 大于等于
      • -lt : 是否小于
      • -le : 是否小于等于
        • 注意:可以使用[],[[ ]],建立使用[]
    • 字符串测试 : 1、字符串要加引号引用 ;2、做比较时使用双中括号[[ ]]
      • == :是否等于
      • > : 是否大于,此处也要使用双中括号
      • < : 是否小于,此处也要使用双中括号
      • != :是否不等于
      • =~ :左侧的字符串是否能被右侧的pattern所匹配,匹配为一部分,不是精确匹配
      • -z “STRING” : 判断指定的字串是否为空,空则为真,不空则假
      • -n “string” :判断指定的字串是否不空,空则为假,不空则真
        • 注意:字符串与变量比较时,最好能在变量上加” ”引起来,在字符串比较的时候, 最好能使用双中括号,建议使用[[ ]] ,做等值比较时,必须要在等号前后空格,如果引用是变量,也是需要加空格,变量名可以不用引号引起来
  2. 文件测试
    • 存在性测试:
      • -a FILE
      • -e FILE
        • 文件的存在性测试,存在则为真,否则则为假
    • 存在性及文件类型
      • -b FILE : 是否存在,并且为块设备文件
      • -c FILE : 是否存在,并且为字符设备文件
      • -d FILE : 是否存在,并且为目录文件
      • -f FILE : 是否存在, 并且为普通文件
      • -h FILE 或者 -L FILE : 是否存在并且为符号连接文件
      • -p FILE : 是否存在, 且为命名管道文件
      • -S FILE :是否存在,且为套接字文件
  3. 文件权限测试
    • -r FILE : 是否存在,并且可读,对当前用户可读
    • -w FILE : 是否存在, 并且可写
    • -x FILE : 是否存在, 并且可执行
  4. 特殊权限测试
    • -g FILE : 是否存在, 并且拥有SGID权限
    • -u FILE : 是否存在,并且拥有SUID权限
    • -k FILE : 是否存在, 且拥有sticky权限
  5. 文件是否有内容
    • -s FILE :是否存在,并且是否有内容
  6. 时间戳测试
    • -N FILE : 文件自从上一次读取操作后,是否被修改过
  7. 从属关系测试:
    • -O FILE : 当前用户是否为文件的属主
    • -G FILE : 当前用户是否属于文件的属组
  8. 双目测试(文件新旧对比)
    • FILE1 -ef FILE2 : FILE1 与FILE2是否为指向同一个文件系统上的相同的inode的硬连接
    • FILE1 -nt FILE2 : FILE1是否新于FILE2
    • FILE1 -ot FILE2 : FILE1是否旧于FILE2
  9. 组合测试条件
    • 逻辑运算:
      • 第一种:
        • COMMAND1 && COMMAND2
        • COMMAND1 || COMMAND2
        • !COMMAND
          • 例:[ -O FILE ] && [ -r FILE] :是否可读并且为属主
      • 第二种:
        • [ expression1 -a expression2 ]
        • [ expression1 -o expression2 ]
        • ![ expression1 ]
          • 例: [ -O FILE -a -x FILE ] : 是否是属主并且有执行权限
注意:-a -o 只能在[]中使用,如果需要在双括号中使用逻辑换算,需要使用 && || 来代替

Bash脚本之状态返回值:

  • 默认是脚本中执行的最后一条命令的状态返回值。
  • 自定义状态退出状态码:
    • exit [n] :n为自己指定的状态码;0表示成功,非零表示失败
      • 注意:shell进程遇到exit时,即会中止,因此整个脚本执行即为结束

bash编程之向脚本传递参数

  1. 位置参数变量
    • 例:myscript.sh argu1 argu2
  2. 脚本中引用方式:
    • $1,$2…….${10},${11},….
  3. 位置参数变量轮替
    • shift : 把引用过的参数T掉,在脚本中永远只使用$1引用下一个
      • 例: shift 2 : 踢两个,这样就可以在脚本中永远以$1和$2来引用后面的参数

bash编程之特殊变量

  • $0 :脚本文件路径本身; 取文件名:basename $0
  • $# : 脚本参数个数
  • $* : 所有参数,每个参数当作为一个字串,一般用于保存用户的参数
  • $@: 所有参数,所有参数当作为一个字串,一般用于保存用户的参数

bash编程之语句类型

  1. 顺序执行:逐条运行
  2. 选择执行:
    • 两个或者以上的分支:满足条件时只会执行其中一个满足条件的分支
  3. 循环执行:
    • 某代码片断(循环体)要执行0、1或多个来回

脚本之语法错误检查

  • bash -n script.sh
  • bash -x script.sh

脚本之用户交互的实现

  1. read [option]...[name...]
    • -p PROMPT: 直接提示输入信息,保存至变量
    • -t TIMEOUT : 超时设置,默认秒为单位

1、 选择执行:

  1. 单分支的if语句
     if 测试条件;then
         代码分支
     fi 
    
  2. 双分支的if语句
     if 测试条件;then
         条件为真时执行的分支
     else
         条件为假时执行的分支
     fi
    
  3. 多分支的if语句
     if 测试条件;then
         条件为真时执行
     elif
         条件为真时执行
     else
         条件为假是执行
     fi
    

2、循环执行

  1. for循环语句
     for VAR in LIST;do
         循环体
     done
    
进入条件:只要列表有可用元素,即可进入循环
退出条件:列表中的元素遍历完成后,即退出循环
列表的生成方式:
  • 直接给出
  • 整数列表
    • a:{start..end}
    • b: $(seq 起始数值 [步长] 结束数值)
  • 返回列表的命令
  • glob
  • 变量引用
  1. while循环语句
     while CONDITION1;do
         循环体
         循环控制变量修正表达式
     done
    
条件进入:CONDITION测试为真
条件退出:CONDITION测试为假
  1. until循环语句
     until CONDITION;do
         循环体
         循环控制变量修正表达式
     done
    
条件进入:CONDITION测试为假
条件退出:CONDITION测试为真

在循环中控制循环的方法

1、continue
  • 表示提前结束本轮循环,而直接进入下一轮循环的条件测试

      while CONDITION1;do
          COMMNAD1
          if CONDITION2;then
              continue
          fi
              COMMNAD N 
      done
    
示例 : 求100以内的所有偶数之和
    #!/bin/bash
            declare  -i evensum=0
            declare -i i=0
            while [ $i -le 100 ];do
                let i++
                if [ $[$i%2] -eq 1];then
                    continue
                fi
                let evensum+=$i
            done    
2、break
  • 表示提前跳出循环
示例:100以内所有奇数之和
    #!/bin/bash
    declare  -i evensum=0
    declare -i i=1
    while true;do
        let $oddsum+=$i
        let i+=2
        if [ $i -gt 100 ];then
            break
        fi
    done
while的特殊用法之遍历文件的行
while read VARIABLE;do
    循环休
done < /path/form/somefile
for循环的特殊用法
for ((控制变量初始化;条件判断表达式;控制变量的修正语句));do
    循环体
done
控制变量初始化:仅在循环代码开始运行时,执行一次
控制变量的修正语句:每轮循环结束会先进行控制变量修正运算,而后再做判断
case选择执行语法
case $variable in
    pattern1)
        分支1
        ;;
    pattern2)
        分支2
        ;;
    pattern3)
        分支3
        ;;
    *)
        分支N
esac
case支持glob网络的通配符:
* 
?
[]
a|b :a或者b

shell函数

把一段独立功能的代码当作一个整体,并定义一个函数名字,命名的代码段,就称之为一个函数。定义的函数代码段不会自动执行,需在调用的时候执行。调用函数就是批是代码中给出指定的函数名即可。函数可出现在任何位置,在代码执行时,都会被自动替换为函数代码。其函数命名不应该为命令名。其可在过程式编程中实现代码重用。以此实现模块化编程结构化编程.

  • 语法一
    function f_name {
    ...函数体...
    }
  • 语法二
    f_name () {
    ...函数体...
    }
函数的生命周期
  • 每次被调用时创建,返回时终止
函数的返回值
  • 函数返回值:
    • 函数的执行结果返回值:
      • (1) 使用echo或printf命令进行输出;
      • (2) 函数体中调用的命令的执行结果;
    • 函数的退出状态码:
      • (1) 默认取决于函数体中执行的最后一条命令的退出状态码;
      • (2) 自定义:return
示例:给定一个用户名,取得用户的id号和默认shell
#!/bin/bash
#

userinfo() {
    if id "$username" &> /dev/null; then
        grep "^$username\>" /etc/passwd | cut -d: -f3,7
    else
        echo "No such user."
    fi
}

username=$1
userinfo

username=$2
userinfo 
传递参数给函数
  • 在函数体中当中,可以使用$1,$2, ...引用传递给函数的参数;还可以函数中使用$*或$@引用所有参数,$#引用传递的参数的个数;
  • 在调用函数时,在函数名后面以空白符分隔给定参数列表即可,例如,testfunc arg1 arg2 arg3 ..
示例:添加10个用户,其添加用户的功能使用函数实现,用户名做为参数传递给函数
                #!/bin/bash
                #
                # 5: user exists

                addusers() {
                    if id $1 &> /dev/null; then
                        return 5
                    else
                        useradd $1
                        retval=$?
                        return $retval
                    fi
                }

                for i in {1..10}; do
                    addusers ${1}${i}
                    retval=$?
                    if [ $retval -eq 0 ]; then
                        echo "Add user ${1}${i} finished."
                    elif [ $retval -eq 5 ]; then
                        echo "user ${1}${i} exists."
                    else
                        echo "Unkown Error."
                    fi
                done
函数变量的作用域
  • 局部变量
    • 作用域是函数的生命周期,在函数结束时被自动销毁,定义的方法如下:
      • lacal VARIABLE=VALUE
  • 本地变量
    • 作用域是运行脚本的shell进程的生命周期,作用范围为当前shell脚本程序文件
  • 示例
      #!/bin/bash
      #
      name=tom
      f_name() {
              local name=jerry
      }
    
      f_name
      echo $name
      
      注意:以上正常情况下会显示name=tom,如果不使用local定义为本地函数变量, 那么应该name=jerry.
    
注意:在函数中定义变量尽量使用local来定义变量

=========

bash之数组

什么是数组?

存储多个元素的连续的内存空间,其数组只有一个名字,其数组的索引号从0开始。

定义一个数组
  • declare -a NAME : 声明一个索引数组
  • declare -A NAME : 声明一个关联数组
    • 索引数组为索引号(下标)从0开始,关联数组的索引号可以自定义,其bash4及以后版本支持关联数组
数组中元素的赋值方式
  • 1、一次只赋值一个元素
    • NAME[0]=pig
    • NAME[1]=dog
  • 2、一次赋值全部元素
    • NAME=("VAL1","VAL2","VAL3",...)
  • 3、只赋值特定元素
    • NAME=([0]="val1" [3]="val3",....): 稀疏格式的数组定义
  • 4、read -a array_name
    • val1 val2 val3.....(直接在提示符中写,写后回车即可)
  • 5、declare -A world
    • world[us]="america"
    • world[uk]="United kingdom" :这种方式即关联数组,直接给定下标名称
数组中的元素引用
  • echo ${name[0]}
    • 引用时只给数组名,表示引用为下标为0的元素
数组的长度引用 (即数组中元素的个数 )
* ${#ARRAY_NAME[*]}
* ${#ARRAY_NAME[@]}

        注意:${#ARRAY_NAME},表示引用第一个元素的字符串长度
引用数组中的所有元素
  • ${array_name[*]}
  • ${array_name[@]}
数组元素切片
  • ${array_name[@]:offset:number}
    • offset :要跳过元素的个数
    • number :要取出元素的个数,省略number时,表示取偏移量之后的所有元素
向非稀疏数组中追加元素
  • array_name[${array_name[*]}]=
删除数组中的某元素
  • unset array[index]
关联数组的定义
  • declare -A array_name
  • array_name=([index_name1]="val1" [index_name2]="val2")

bash之信号捕捉

trap 命令
  • -l : 列出所有信号
  • man 7 signal : 查看所有信号的功用
  • kill -l : 查看所有信号
向脚本传递信号示例
    #!/bin/bash
    #
    trap 'echo "dou ni wan er."' INT
    trap 'echo "quit";exit1' INT
    
    注意:可以把捕捉信号定义在一个函数里,在其它位置调用,脚本参考<脚本合集>

bash之颜色设置

  • echo -e "\033[42;35;5mHello world\033[0m"
    • [左侧]4表示后景色

    • [左侧]3表示前景色

    • 颜色分类:1,2,3,4,5,6,7

    • #m : 定义加粗 、闪烁等功能

        多种控制符,可组合使用,彼此间用分号隔开
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容