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上面的临时“根”切换到磁盘上面