• shell_10--数组和字符串



    数组与字符串
    数组
         数组说白了就是一段连续的变量,一段连续的内存存储空间
         解决:变量过多的问题; 在同一类变量中,我们不需要去定义多个名字,而是以数组的方式来定义;(列表)
          学院云三本[1]=张三
            1、数组名
            2、索引
            3、值
         如何去定义数组:
            declare -i 定义整数 (申明)
            declare -a 定义数组array
            declare -A 定义嵌套的数组
                 学院云[1]=云计算专业
                 云计算专业[1]=云三班
                   云三班[1]=张三
             【这样数组值,在bash中并不常用】
             【python 和 shell】
              array=(值)
              array=()
     
       如何给数组赋值:
          array=()
          1、array[8]=张三   (在计算机语言中,索引一般从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"
    

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

    字符串

       printf 
       name=张三
       haigth=183
     
       python  ( %s ,他的升高为 %d ) % (name, hiaght)
          输出: 张三,他的身高为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
  • 相关阅读:
    Vim Reference
    Java 8 Consumer、Supplier、Predicate、Function
    Java 8 Stream 用法
    Java 基础 Builder模式
    Spring/Spring-Boot 学习 使用自定义的ArgumentResolver
    架构之分布式图片存储系统架构
    微服务和SOA服务
    Centos 上 Tengine安装
    .NET平台上插拔姿势的AOP
    P1424 刷题记录
  • 原文地址:https://www.cnblogs.com/lzqitdl/p/11392440.html
Copyright © 2020-2023  润新知