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

    数组与字符串

    数组
      数组说白了就是一段连续的变量,一段连续的内存存储空间
      解决:变量过多的问题; 在同一类变量中,我们不需要去定义多个名字,而是以数组的方式来定义;(列表)
        1、数组名
        2、索引
        3、值

      如何去定义数组:
        declare -i 定义整数 (申明)
        declare -a 定义数组array
        declare -A 定义嵌套的数组
      array=(值)
      array=()

      如何给数组赋值:
        array=()
        1、array[8]=xx (在计算机语言中,索引一般从0开始计算)
                (索引并不一定是数字 : key-value array[张卓]=1.87m)
                (shell中数组赋值,可以跳跃(跳跃赋值))
        2、array=(/var/log/*.log)
          做遍历
            array=(a b c d e)
        3、array=('张卓=187' '梁浩田=186' ... )
        4、通过read命令来赋值
          read -t 延迟 -p "指定说明" -a 输入数组所需的变量值
          read -a a b c d e

      如何去调用数组:
        ${变量名}
        ${数组名[索引]} 定义的是哪个索引,就看到是对应索引指定的值
        ${数组名} 默认调用 索引=0 的值 $array(最好不要这样写)
        ${数组名[*]} 或者 ${数组名[@]} 调用数组内所有的值 $* $@

      练习下: 统计 /var/log/*.log 中 索引为偶数 的文件 的行数的 和;
        a=(/var/log/*.log)
        for i in {0..7};do
          if [ $[$i%2] -eq 0 ];then
            line=`wc -l ${a[$i]} | cut -d' ' -f1`
            sum+=$line # sum+=`wc -l ${a[$i]} | cut -d' ' -f1` # sum+=$(wc -l ${a[$i]} | cut -d' ' -f1)
          fi
        done
        echo $sum

        1、调用数组的数组长度
        length("变量")
        ${#变量名[*]} 或者 ${#变量名[@]}
        2、添加数组值的特殊方式
        ${变量名[${#变量名[@]}]}="值" 或者 ${变量名[${#变量名[*]}]}="值"


      关于数组的其他操作
        数组切片
          ${变量名[@]:偏移量:所需要取出值的个数}
          echo ${a[*]:2:4}
          ${变量名[@]:偏移量}
        删除值
          unset ${变量名[索引]}
          注意:删除是索引所对的值,而没有带着索引一块删除;
          
        修改值
          a[3]=c
          a[3]=d 覆盖即修改


      练习:
      生成10个随机数,打印其中最大的数值
        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"

        生成10个随机数,并进行排序


    字符串:
    ==============================
      printf
      name=xx
      hiagth=183

      python ( %s ,他的升高为 %d ) % (name, hiaght)
        输出: xx,他的升高为183

        %s
        %d
        %f

        %[num]s 指定该字符串占位的宽度
        %-[num]s 代表左对齐
            【居中对齐】

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

      1、字符串切片:
        数组切片:${变量名[@]:偏移量:数值个数}
        字符串:${变量名:偏移量:数值个数}
          ${变量名: -数值个数} 【*注意:冒号后面一定要加空格*】
            ${变量名:-word} 默认赋值的意思
          read "sasasa:" test
          [ -z $test ] && test=abc
      2、基于模式取子字符串
        从左自右
        ${变量名#pattern} 删除pattern第一次匹配到的字串
        ${变量名##pattern} 删除所有pattern匹配到的字串

        从右自左
        ${变量名%pattern}
        ${变量名%%pattern}

        思考:取url中IP(域名)

      3、字符替换
        ${变量名/pattern/替换后的字符串} 【pattern并不是正则表达式,而是文件通配符】
          匹配第一个pattern,来进行替换
        ${变量名//pattern/替换后的字符串}
          匹配所有哦pattern,并进行替换
        ${变量名/#pattern/替换后的字符串}
          指定匹配行首必须是 pattern ,才会替换
        ${变量名/%pattern/替换后的字符串}
          指定匹配行尾必须是 pattern , 才会替换

        注意: / 分隔符,不能替换为(# % 等特殊字符 ,和sed 不一样)

      4、查找并删除
          替换中,不指定替换字符串,即为删除
          ${变量名/pattern}
          ${变量名//pattern}
          ${变量名/#pattern}
          ${变量名/%pattern}

      5、替换大小写
        tr 替换大小写
        tr [[:lower:]] [[:upper:]] < filename

        ${变量名^^} 将字符串全部替换为大写
        ${变量名,,} 将字符串全部替换为小写

      6、变量赋值
        变量名1=${变量名2:-word} 注意没有空格! 输入默认值的作用 , 变量2 没有值,就将 word 默认值赋值给 变量1
        变量名1=${变量名2:+word} 不常用 变量2 有值的情况下,才将 word默认值赋值给变量1
        ${变量:=word} 如果变量没有值,就将word赋值给变量,有值,则使用原来的值
        变量1=${变量2:?error_infor} 如果变量2 没有值,输出erro_infor错误信息

      7、脚本应用其他文件中的变量,如何实现?
        filename1
        vim filename1
          a=1
          b=2
        :wq

        vim filename1.sh
          . /全路径/filename 后者 source /全路径/filename //执行整个代码
          c=$[$a+$b]
          ehco $c
        :wq

      bash filename1.sh

      练习:修改hostname,定义一个 hostname文件 name=xxx ,hostname.sh
        hostname
          name=test.com

        hostname.sh
        if [ -r /root/hostname ];then
          . /root/hostname
        else
          echo "/root/hostname 没有执行权限"
          exit 1
        fi

        hostname $name

      8、两个命令
        mktemp 创建临时文件以及目录 temp -- /tmp
          避免大家取的文件名字重复;mktemp 名字.XXXXXX (XX代表随机数(字母和数字))
          默认创建是随机的文件
          -d 创建的就是随机的 目录

          file=`mktemp a.XXXX`

        install 复制或删除文件,用法同copy
          优点可以指定权限来复制文件
          用法:intall a文件 b目录 //复制a文件到b目录,并回复初始权限(文件:755 目录:644)
          -t 源目对换
          -d 创建
          -m MODE
          -o OWNER
          -g GROUP

      练习:
      1、获取此命令所依赖的所有库文件的列表
        Ldd /bin/cat
      2、复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下
        /bin/bash  /mnt/sysroot/bin/bash
        /usr/bin/passwd  /mtn/sysroot/usr/bin/passwd
      3、复制此命令所依赖的所有库文件至目标目录下的对应路径下
        /lib64/ld-linux-x86-64.so.2  /mnt/sysroot/lib64/ld-linux-x86-64.so.2
        每次复制完成一个命令后,不要退出,而是提示用户输入新的复制的命令,并重复完成上述功能,直到用户输入quit退出;

      chroot
      切换系统根目录
        / -- /dev/sda1
        原来的操作系统的shell程序 切换到 新的一个目录下面去,然后再在这个目录下面放置相应系统启动需要的程序文件;

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

    扩展:
      虚拟化的准备知识:系统的启动原理
      读取系统--读取磁盘:前提就是必须先加载磁盘的驱动程序
      挂载 虚拟根(img虚根文件ramdisk)
      虚根文件文件挂上以后,在grub1.5加载磁盘驱动;
      通过chroot将ramdisk上面的临时“根”切换到磁盘上面
      操作系统:vmlinuz的内核、ramdisk.img

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

      请输入你要复制的命令:cat
        cat /bin/cat
        1、如何取出命令的全路径
          which 命令
          /bin /sbin /usr/bin /usr/sbin
        2、如何读取库文件
          ldd $命令

        3、如何把ldd读取出来的库文件复制到目标目录
          考虑重复的问题 /bin/cp


    declare -a a

    while true;do
      read -p "请输入一个命令:" Command
    #    if [ -z $Command ];then
    #    echo "Usage: 输入命令名字 eg. cat"
      if ! which $Command &> /dev/null;then
        echo "请重新输入一个正确的命令值"
      elif [ $Command=quit ];then
        echo "谢谢"
        break
      else
        C=`which $Command | tail -1`
        a=`ldd $C | grep -o "/lib/.*[[:space:]]"`

        for i in `seq 0 $[${#a[*]}-1]`;do
          /bin/cp $C /abc/bin/
          /bin/cp ${a[$i]} /abc/lib/
        done
      fi
    done



  • 相关阅读:
    数据结构Java版之基数排序(四)
    数据结构Java版之递归与迭代算法(五)
    SpringBoot项目在新电脑上的配置运行,包括JDK+MAVEN+Git+SpringBoot配置等
    .NET 控制Windows文件和目录访问权限研究(FileSystemAccessRule)
    Navicat Premium 12.0.18安装与激活
    Spring Data JPA方法定义规范
    在c/c++中调用Java方法
    在Java中调用C/C++本地库
    XP环境下C# 调用Pocess.start()时提示文件找不到的错误解决办法
    C++ 获取当前正在执行的函数的相关信息
  • 原文地址:https://www.cnblogs.com/wangzijie123456/p/11397875.html
Copyright © 2011-2022 走看看