shell脚本8-20

数组

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

2、数组的写法:数组名[索引]=值

3、数组赋值:

(1)在计算机语言中,索引一般从0开始计算,索引并不一定是数字也可以是key-value(键值对),如:array[小明]=1.87m

(2)array=(/var/log/*.log),可以用来做遍历

(3)直接赋值:array=(a b c d e)

(4)通过键值赋值:array=('小明=187''张三=185' '李四=176')

(5)通过read命令赋值:read -t 延迟时间 -p “指定说明” -a 输入数组所需的变量值  例: read -a a b c d e

4、调用数组:普通变量:${变量名}

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

        ${数组名}【默认调用索引等于0的值】

        ${数组名[*]}或者${数组名[@]}(调用数组内所有的值,建议使用@)

练习:统计/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

5、调用数组长度:length(“变量”)、${#变量名[*]}或者${#变量名[@]}

6、添加数组值的特殊方式:${变量名[${#变量名[@]}]}="值"或者 ${变量名[${#变量名[*]}]}="值"

7、关于数组的其他操作:

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

          例:${a[@]:2:4}(从数组a的第二个索引开始取值,取四个)

(2)删除值:unset ${变量名[索引]} 【注意:删除是索引所对的值,而没有带着索引一块删除;】

(3)修改值:例:a=c a=d  【覆盖即修改】

练习:生成十个随机数,然后并进行排序。

declare -i a=0
for i in `seq 0 9`;do
        a=$RANDOM
        echo $a
done >/root/a.txt
b=`sort -n /root/a.txt`
echo $b

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

eclare -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、printf命令:用来做格式化输出

2、格式化输出占位符:%d(整型)、%s(字符串型)、%f(浮点型)

%[num]s:指定该字符串占位的宽度,默认为右对齐,左对齐时为%[-num]s

3、字符串切片:${变量名:偏移量:所需要取出值的个数}

        ${变量名:  -所需取出的值的个数}

         【注意冒号后面要加一个空格,冒号后面不加空格时为${变量名:-word},表示默认赋值的意思】

         

4、基于模式取子字符串

(1)【从左自右删除】

${变量名#pattern} 删除pattern第一次匹配到的字串
${变量名##pattern} 删除所有pattern匹配到的字串

(2)【从右自左删除】 

${变量名%pattern}  删除pattern第一次匹配到的字串
${变量名%%pattern}  删除所有pattern匹配到的字串

 

5、字符替换:${变量名/pattern/替换后的字符串} (匹配第一个pattern,来进行替换)【pattern并不是正则表达式,而是文件通配符】

        

      ${变量名//pattern/替换后的字符串}  匹配所有pattern,并进行替换

      ${变量名/#pattern/替换后的字符串}指定匹配行首必须是 pattern ,才会替换
      ${变量名/%pattern/替换后的字符串}指定匹配行尾必须是 pattern , 才会替换

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

6、替换大小写:${变量名^^}【将字符串小写全部替换为大写】

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

7、变量赋值:${变量名:-word}【赋值时冒号后面不能有空格,有空格是切片】

         ${变量名:+word}【不常用,在变量有值的情况下,才将Word默认值赋给变量】

       变量1=${变量2:=word}【变量2有值时,将变量2的值赋给变量1;否则,将word赋值给变量1】

       变量1=${变量2:?error_infor}【当变量2没有值时,输出error_infor】

练习:修改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、两个变量

(1)mktemp:创建临时文件以及目录 temp -- /tmp

         避免取的文件名字重复;mktemp 名字.XXXXXX (XX代表随机数(字母和数字))
         默认创建是随机的文件
         -d 创建的就是随机的 目录

         file=`mktemp a.XXXX`

(2)install:复制或删除文件,用法同copy

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

9、系统的启动原理

读取系统--读取磁盘:前提就是必须先加载磁盘的驱动程序
挂载 虚拟根(img虚根文件ramdisk)
虚根文件文件挂上以后,在grub1.5加载磁盘驱动;
通过chroot将ramdisk上面的临时“根”切换到磁盘上面

posted on 2019-08-23 09:37  cqyyyyy  阅读(148)  评论(0编辑  收藏  举报