bash编程之数组和字符串处理

数组:

程序=指令+数据
    
    指令:
    数据:变量、文件

数组:存储过个元素的连续的内存空间;

变量:存储单个元素的内存空间;

数组名:整个数组只有一个名字;

数组索引:编号从0开始;
    
    数组名[索引],
    ${ARRAY_NAME[INDEX]}

注意:bash-4及之后的版本,支持自定义索引格式,而不仅仅是0,1,2 ...数字格式;此类数组称之为“关联数组”

声明数组:

如果往一个变量里边指定多个元素,如果没有声明为数组,只不过是当成多个元素的的那个字符串,declare -a NAME :声明索引数组declare -A NAME:声明关联数组

数组中元素的赋值方式:

(1)一次只赋值一个元素
    ARRAY_NAME[INDEX]=value

(2)一次赋值全部元素
    ARRAY_NAME=("VAL1""VAL2""VAL3" ...)

(3)只赋值特定元素;
    ARRAY_NAME=([0]="VAL1" [3]="VAL4" ...)

引用数组中的元素: ${ARRAY_NAME[INDEX]} ${ARRAY_NAME[*]}:引用数组中的所有元素

注意:引用时,只给数组名,表示引用下标为0的元素;

数组的长度(数组中元素的个数):

${#ARRAY_NAME[*]}${#ARRAY_NAME[@]}

示例:

生成10个随机数,并找出其中最大值;

#!/bin/bash#declare -a randdeclare -l max=0for i in {0..9};do
        rand[$i]=$RANDOM
        echo ${rand[$i]}
        [ ${rand[$i]} -gt $max ] && max=${rand[$i]}doneecho "MAX:$max"[root@centous1 ~]# ./123.sh773293356870254241086732703140529551975322949MAX:32703

练习:定义一个数组,数组中的元素是/var/log目录下所有以.log结尾的文件;统计其下标为偶数的文件中的行数之和;

#!/bin/bash#declare -a files
files=(/var/log/*.log)declare -i lines=0for i in $(seq 0 $[${#files[*]}-1]);do
        if [ $[$i%2] -eq 0 ];then
                let lines+=$(wc -l ${files[$i]} | cut -d' ' -f1)        fidoneecho "Lines:$lines"[root@centous1 ~]# ./lines.shLines:3153

数组元素切片:

${ARRAY_NAME[@]: offset:number} offset:要咯过的元素个数; number:要取出的元素个数;省略number时,表示取偏移量之后的所有元素;

向非稀疏数组中追加元素:

ARRAY_NAME[${#ARRAY_NAME[*]}=

删除数组中的某元素;

unset ARRAY[INDEX]

关联数组:

declare -A ARRAY_NAME
    
    ARRAY_NAME=([index_name1]="value" ...)

bash的内置字符串处理工具:

字符串切片:

取字符串的字串;
去字符串的最右侧的几个字符:${var: -number}
注意:冒号后边必须有一个空白字符;
[root@centous1 ~]# name=jarry[root@centous1 ~]# echo ${name:2:2}rr
[root@centous1 ~]# echo ${name:2}rry
[root@centous1 ~]# echo ${name: -2}ry

基于模式取字符串;

${var#*word}:其中word是指定的分隔符;功能:自左而右,查找var变量所储存的字符串中,第一次出现的word分隔符,删除此分隔符至字符尾部之间的所有字符;${var##*word}:其中word是指定的分隔符;功能:自左而右,查找var变量所储存的字符串中,最后一次出现的word分隔符,删除此分隔符至字符尾部之间的所有字符;
[root@centous1 ~]# mypath="/etc/init.d/functions"[root@centous1 ~]# echo ${mypath#*/}etc/init.d/functions
[root@centous1 ~]# echo ${mypath##*/}functions

${var%word*}:其中word是指定的分隔符;功能:自右而左,查找var变量所储存的字符串中,第一次出现的word分隔符,删除此分隔符至字符尾部之间的所有字符;

${var%%word*}:其中word是指定的分隔符;功能:自右而左,查找var变量所储存的字符串中,最后一次出现的word分隔符,删除此分隔符至字符尾部之间的所有字符;

[root@centous1 ~]# echo ${mypath%/*}/etc/init.d
[root@centous1 ~]# url=http://www.magedu.com:80[root@centous1 ~]# echo ${url%%:*}http
[root@centous1 ~]# echo ${url##*:}80

注意 * 的位置

查找替换:

${var/PATTERN/SUBSTI}:查找var所表示的字符串中,第一次被PATTERN所匹配到的字符串,将其替换为SUBSSTI所表示的字符串;${var//PATTERN/SUBSTI}:查找var所表示的字符串中,第一次被PATTERN所匹配到的字符串,将其替换为SUBSSTI所表示的字符串;${var/#PATTERN/SUBSTI}:查找var所表示的字符串中,行首被PATTERN所匹配到的字符串,将其替换为SUBSSTI所表示的字符串;${var/%PATTERN/SUBSTI}:查找var所表示的字符串中,行尾被PATTERN所匹配到的字符串,将其替换为SUBSSTI所表示的字符串;

注意:PATTERN中使用golb风格和通配符;

查找删除:

${var/PATTERN}:删除匹配到的第一个

${var//PATTERN}:删除全部匹配到的

${var/%PATTERN}:删除匹配到的尾部那一个

${var/#PATTERN}:删除匹配到的行首那一个

字符大小写转换:

${var^^}:把var中的所有转换成大写

 ${var,,}:把var中的所有转换成大写

变量赋值:

${var:-value}:如果var变量为空,或未设置,那么返回VALUE;否则,返回var变量的值;${var:=value}:如果var变量为空,或未设置,那么返回VALUE;并将VALUE的值赋给var;否则,返回var变量的值;${var:+value}:如果var变量不空,则返回VALUE;${var:?ERROR_INFO}:如果var为空,或未设置,那么返回ERROR_INFO为错误提示;否则,返回var的值;

原创文章,作者:forest,如若转载,请注明出处:http://www.178linux.com/39324

(0)
forestforest
上一篇 2016-08-24 10:45
下一篇 2016-08-24 11:20

相关推荐

  • bash的基础特性[更新中]

    2、bash的工作特性之命令执行状态返回值和命令行展开所涉及的内容及其示例演示。
    3、请使用命令行展开功能来完成以下练习:
    (1)、创建/tmp目录下的:a_c, a_d, b_c, b_d
    (2)、创建/tmp/mylinux目录下的:
    mylinux/
    ├── bin
    ├── boot
    │   └── grub
    ├── dev
    ├── etc
    │   ├── rc.d
    │   │   └── init.d
    │   └── sysconfig
    │   └── network-scripts
    ├── lib
    │   └── modules
    ├── lib64
    ├── proc
    ├── sbin
    ├── sys
    ├── tmp
    ├── usr
    │   └── local
    │   ├── bin
    │   └── sbin
    └── var
    ├── lock
    ├── log
    └── run
    5、如何定义一个命令的别名,如何在命令中引用另一个命令的执行结果?
    6、显示/var目录下所有以l开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。
    7、显示/etc目录下,以任意一个数字开头,且以非数字结尾的文件或目录。
    8、显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录。
    9、在/tmp目录下创建以tfile开头,后跟当前日期和时间的文件,文件名形如:tfile-2016-05-27-09-32-22。
    10、复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。
    11、复制/etc目录下所有以.d结尾的文件或目录至/tmp/mytest2目录中。
    12、复制/etc/目录下所有以l或m或n开头,以.conf结尾的文件至/tmp/mytest3目录中。

    2018-03-17
  • 搭建一个LVS-nat,负载均衡 WordPress

    准备工作 首先配置一下环境:       Directory:ens33 172.16.251.73 ens37 192.168.42.1       RS1:192.168.42.132  gw 192.168.42.1   &…

    2017-06-22
  • Linux上功能强大的文本编辑工具—vim

    vim–Vi Improved是一款全屏文本编辑器 vi: Visual Interface,文本编辑器 可见,vim是vi的升级版,所以我们当然要学习vim! vim的功能强大,自然命令、用法也会种类繁多,想要用的得心应手自然是需要长期的实际操作的,正所谓工欲善其事必先利其器,我们要想能够在linux上从容应对繁多的文本编辑,无疑vim编辑器是…

    Linux干货 2016-08-12
  • shell 脚本之数组 和 yum 【下】

    shell 脚本之数组 和 yum 【下】 数组   变量:存储单个元素的内存空间   数组:存储多个元素的连续的内存空间,相当于多个变量的 集合。   数组名和索引        索引:编号从0开始,属于数值索引        注意:索引可支…

    Linux干货 2016-08-24
  • 马哥教育网络班21期+第15周课程练习

    1、总结sed和awk的详细用法; sed的详细用法 awk的详细用法 2、删除/boot/grub/grub.conf文件中所有行的行首的空白字符; # sed 's/^[[:space:]]*//' /boot/grub/grub.conf 3、删除/etc/fstab文件中所有以#开头,后跟至少一个空白…

    Linux干货 2016-11-14
  • 马哥教育网络班20期+第2周课程练习

    1、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。 常用文件管理命令有:ls、mkdir、cd、pwd、cp、rm、mv、touch、cat、more、less、head、tail等 (1)ls命令:列出目录内容 ls [OPTION]… [FILE]…  &nbs…

    Linux干货 2016-06-29