zoukankan      html  css  js  c++  java
  • Shell-07数组与字符串

    Shell-07数组与字符串

    数组

            数组说白了就是一段连续的变量,一段连续的内存存储空间

            解决:变量过多的问题;在同类的变量中,我们不需要去定义多个名字,而是以数组的方式来定义;(列表)

            数组名 索引 值

            如何定义数组:

                   declare -i 定义整数(声明)

                   declare -a 定义数组array

                   declare -A 定义嵌套的数组

                          共好云班[1]=云计算[1]=云计算三班[1]=某某

                          【这样的数据组值,在bash中并不常用】

            【python和shell】               

    array=1

                  如何给数组赋值:

                         Array=()

    1. array[0]=A (在计算机语言中,索引一般从0开始;索引并不一定是数字:key-value array[A]=1;shell中数组赋值可以跳跃—跳跃赋值)
    2. array=(/var/log/*.log)-----每一个文件对应一个数组值

    array=(a b c d)

    1. array=(‘a=187’c=’188’b=’170’)
    2. 通过read命令进行赋值

    read -t 延时 -p指定说明 -a 输入数组所需的1变量值

    read -a a b c d e

                  如何调取函数:

                         ${变量名}

                         ${数组名[索引]} 定义的是哪个索引,就看到是对应索引指定的值

                         ${数组名} 默认调用 索引=0的值 $array(最好不要这样写)

                         ${数组名[*]}或者${数组名[@]} 调用数组内所有的值

           练习:

                         统计/var/log/*.log中,索引为偶数的文件的行数的和

                          wc -l /var/log/*.log

                          a=(/var/log/*.log)

                          declare -I Line=0

                          declare -I sum=0

                          sum=0

                                for i in {0..7};do

                                       if [ $[$i % 2 ]-eq 0 ]

                                              line=`wc -l  ${a[$i]} | cut -d “ ” -f1`

                                              sum=sum+$line

                                       fi

                                done

                                echo $sum

     

    调用数组数组长度:

             ${#变量名[*]}或者${#变量名[@]}

    添加数组值的特殊方式:

             ${变量名[${#变量名[@]}]}=”值” 或者 ${变量名[${#变量名[*]}]}=”值”

    关于数组的其他操作:

    数组的切片:${变量名[@]:偏移量:所需要取出值的个数}

    a=(/var/log/*.log)

                                       Echo ${a[*]:2:4}

                              ${变量名[@]:偏移量}

    数组删除值:unset${变量名[索引]}

                              删除的是索引所对的值,并不是带着索引删除;

                              【知道值,如何查看索引?】

    修改值:覆盖即为修改

                              a[3]=c  a[3]=2

    练习:

     

    1. 生成10个随机数,打印其中最大的值

    #!/bin/bash

    declare -a a

    declare -i max=0

     

    for i in `seq 0 9`;do

            a[$i]=$RANDOM

            [ ${a[$i]} -gt $max ]&&max=${a[$i]}

    done

    echo ${a[@]}

    echo $max  

    1. 随机生成十个数并排序
    2.  

    字符串:

           printf --- 格式化输出

           name=zqq high=180 

    python print(%s,%d)%(name,high)

    占位符----%s %d %f

    %[num]s 指定该字符串占位的宽度

    %-[num]s 指定左对齐

     

    %-10s表示向左对齐

    %20d 向右对齐20字符

    %-10.1f 代表保留小数点后一位

    printf "%-10s %-10s %-10s " No Name Height

    printf "%-10s %-10s %-10d " 1 zqq 180

    printf "%-10s %-10s %-10d " 2 qqq 190

    printf "%-10s %-10s %-10f " 3 www 188.11

    字符串切片:

           数组切片:${变量名[]:偏移量:数值个数}

           字符串切片:${变量名:偏移量:数值个数}—正切

                                  ${变量名: -数值个数}—反切 冒号后面要加空格

                                  ${变量名:-word}—默认赋值的意思

                                       read “sasasa:” test

                                       [ -z $test ] && test=123

    基于模式取子字符串:

           从左自右

           ${test#pattern}  删除pattern第一次匹配到地字符串

           ${test##pattern}  删除所有pattern匹配到地字符串

           [root@localhost ~]# a=123qwe123wsx

    [root@localhost ~]# b=${a#*1}--------去除1

    [root@localhost ~]# echo $b

    23qwe123wsx

    [root@localhost ~]# a=/var/log/anaconda/anaconda.log/16.sh

    [root@localhost ~]# b=${a##*/}

    [root@localhost ~]# echo $b

    16.sh

           [root@localhost ~]# a=/var/log/anaconda/anaconda.log/16.sh

    [root@localhost ~]# b=${a#*/}

    [root@localhost ~]# echo $b

    var/log/anaconda/anaconda.log/16.sh

    [root@localhost ~]# url=http://192.168.72.100:8080

    [root@localhost ~]# b=${url##*:}

    [root@localhost ~]# echo $b

    8080

    从右自左

    ${变量名%pattern}

    ${变量名%%pattern}

    [root@localhost ~]# url=http://192.168.72.100:8080

    [root@localhost ~]# echo ${url%:*}

    http://192.168.72.100

    [root@localhost ~]# echo ${url%%:*}

    http

    [root@localhost ~]# url=http://192.168.72.100:8080

    [root@localhost ~]# url1=${url#*//}

    [root@localhost ~]# url2=${url1%:*}

    [root@localhost ~]# echo $url2

    192.168.72.100

    字符替换:

           ${变量名/pattern/替换后的字符串}

           匹配第一个pattern替换 【pattern并不是正则表达式,是文件通配符】

           [root@localhost ~]# url=http://192.168.72.100:8080

    [root@localhost ~]# echo ${url/192.168/10.6}

    http://10.6.72.100:8080

    [root@localhost ~]# url=http://192.168.72.100:8080

    [root@localhost ~]# echo ${url/[1-9]*.*.*.*[0-9]/www.baidu.com}

    http://www.baidu.com

    ${变量名//pattern/替换后的字符串}

    匹配所有的pattern,并进行替换

    ${变量名/#pattern/替换后的字符串}

    指定pattern必须是行首

    [root@localhost ~]# a=`cat /etc/passwd|grep root`

    [root@localhost ~]# echo $a

    root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin

    [root@localhost ~]# echo ${a/#root/rooter}

    rooter:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin

    [root@localhost ~]# echo ${a/#r??t/rooter}

    rooter:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin

    [root@localhost ~]# echo ${a//bin/bash//sbin/nologin}

    root:x:0:0:root:/root:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin

    ${变量名/%pattern/替换后的字符串}

    指定行尾必须是pattern才替换

    [root@localhost ~]# a=`cat /etc/passwd|grep root`

    [root@localhost ~]# echo ${a/%/?bin/*/aaa}

    root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:aaa

    [root@localhost ~]# echo $a

    root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin

    / 分隔符,不能替换为(#%等特殊字符,与sed不同)

    查找并删除

           替换中,不指定替换字符串,即为删除

           ${变量名/pattern }

           [root@localhost ~]# a=`cat /etc/passwd|grep root`

    [root@localhost ~]# echo $a

    root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin

    [root@localhost ~]# echo ${a/%operator*n/}

    root:x:0:0:root:/root:/bin/bash

    ${变量名//pattern }

    ${变量名/#pattern }

    ${变量名/%pattern }

    替换大小写:

           tr 替换大小写

           tr [[:lower:]] [[:upper:]] < filename

           ${变量名^^}---替换大写

           ${变量名,,}----替换小写

    tr [:lower:] [:upper:] < /etc/passwd

           [root@localhost ~]# a=$(cat /etc/passwd | head -1)

    [root@localhost ~]# echo $a

    root:x:0:0:root:/root:/bin/bash

    [root@localhost ~]# echo ${a^^}

    ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH

    [root@localhost ~]# b=${a^^}

    [root@localhost ~]# echo $b

    ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH

    [root@localhost ~]# echo ${b,,}

    root:x:0:0:root:/root:/bin/bash

    变量赋值:

           变量名1=${变量名2:-word}  注意没有空格!!!

           输入默认值的作用,变量2没有值,将word默认值赋值给变量1

           [root@localhost ~]# echo $b

    ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH

    [root@localhost ~]# c=${b:-qaz}

    [root@localhost ~]# echo $b

    ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH

    [root@localhost ~]# echo $c

    ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH

    [root@localhost ~]# e=${f:-qaz}

    [root@localhost ~]# echo $f

          

    [root@localhost ~]# echo $e

    qaz

           变量名1=${变量名2:+word} 不常用

           变量2在有值的情况下,才将word默认值赋值给变量1

           [root@localhost ~]# h=1

    [root@localhost ~]# echo $h

    1

    [root@localhost ~]# g=${h:+qqq}

    [root@localhost ~]# echo $g

    qqq

    [root@localhost ~]# echo $h

    1

    ${变量2:=word}

           如果变量没有值,就将word赋值给变量,有值,则使用原来的值

    变量名1=${变量2:?error_info}

           如果变量2没有值,输出error_infor错误信息

    脚本引用其他文件中的变量如何实现?

           filename1

           vim filename1

                  A=1

                  B=2

           :wq

           vim filename1.sh

                  ./全路径/filename 后者 source /全路径/filename

                  C=$[$a+$b]

                  Echo $c

    bash filename1.sh

    练习:

           修改hostname,定义一个hastname文件name=xxx,hostname.sh

     

    两个命令:

           mktemp 创建临时文件以及目录 temp-- /tmp

                          避免大家取得文件名字重复;mktemp 名字.XXXXXX(XX代表随机数,随机的字母和数字)

                                默认创建的是随机的文件

                         -d 创建的就是随机的目录

                         File=`mktemp a.XXX`

           install  复制和删除文件 用法同cp

                         优点:可以指定权限来复制文件

                         用法:intall  a文件 b目录 //复制a文件到b目录,并恢复初始权限(文件755 目录644) -t 源目对换 -d 创建目录 -m指定权限(mask) -o指定所属组 -g指定所属组

    练习:

    Ldd查看所有程序的库文件

    创建目录

           Chroot 切换系统根目录

           /--/dev/sda1

           原来的操作系统的shell程序 切换到 新的1目录下面去,然后再在这个目录下面放置相应的系统启动需要的程序文件。

    如何取出命令的全路径

    如何读取库文件---ldd

    如何把通过ldd读取出来的库文件复制到目标目录

           不管如何都要覆盖掉

    扩展:

                  虚拟化的准备知识:系统的启动原理

                         读取系统—读取磁盘:提前就是必须先加载磁盘的驱动程序

                         挂载虚拟根(img虚根文件 ramdisk)

                         虚根文件 文件挂上以后,在grub1.5加载磁盘驱动;

    通过chroot将ramdisk上面的临时“根”切换到磁盘上面

                  操作系统:vmlinuz的内核、ramdisk.img

     

  • 相关阅读:
    DedeCMS Xss+Csrf Getshell dedefile_manage_control.php
    dedeCMS /plus/ad_js.php、/plus/mytag_js.php Vul Via Injecting PHP Code By /plus/download.php Into DB && /include/dedesql.class.php
    phpMyadmin /scripts/setup.php Execute Arbitrary PHP Code Via A Crafted POST Request CVE-2010-3055
    Linux inode && Fast Directory Travel Method(undone)
    Linux进程自保护攻防对抗技术研究(Process Kill Technology && Process Protection Against In Linux)
    PHP Web System Optimization(undone)
    PHP Simulation HTTP Request(undone)
    Server Data Synchronization Via Linux rsync、rsync+inotify Between Load Balance Server
    Ecshop /admin/get_password.php Password Recovery Secrect Code Which Can Predict Vulnerability
    Dedecms includedialogselect_soft_post.php Upload Any Files To The Specified Directory Via Variable Not Initial Flaw Bypass Extension Defence
  • 原文地址:https://www.cnblogs.com/KAJIA1/p/11392374.html
Copyright © 2011-2022 走看看