Shell-07数组与字符串
数组
数组说白了就是一段连续的变量,一段连续的内存存储空间
解决:变量过多的问题;在同类的变量中,我们不需要去定义多个名字,而是以数组的方式来定义;(列表)
数组名 索引 值
如何定义数组:
declare -i 定义整数(声明)
declare -a 定义数组array
declare -A 定义嵌套的数组
共好云班[1]=云计算[1]=云计算三班[1]=某某
【这样的数据组值,在bash中并不常用】
【python和shell】
array=1
如何给数组赋值:
Array=()
- array[0]=A (在计算机语言中,索引一般从0开始;索引并不一定是数字:key-value array[A]=1;shell中数组赋值可以跳跃—跳跃赋值)
- array=(/var/log/*.log)-----每一个文件对应一个数组值
array=(a b c d)
- array=(‘a=187’c=’188’b=’170’)
- 通过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
练习:
- 生成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
- 随机生成十个数并排序
字符串:
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