shell_10--数组和字符串
数组与字符串
数组
数组说白了就是一段连续的变量,一段连续的内存存储空间
解决:变量过多的问题; 在同一类变量中,我们不需要去定义多个名字,而是以数组的方式来定义;(列表)
学院云三本[1]=张三
1、数组名
2、索引
3、值
如何去定义数组:
declare -i 定义整数 (申明)
declare -a 定义数组array
declare -A 定义嵌套的数组
学院云[1]=云计算专业
云计算专业[1]=云三班
云三班[1]=张三
【这样数组值,在bash中并不常用】
【python 和 shell】
array=(值)
array=()
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
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)
${#变量名[*]} 或者 ${#变量名[@]}
2、添加数组值的特殊方式
${变量名[${#变量名[@]}]}="值" 或者 ${变量名[${#变量名[*]}]}="值"
${变量名}
${数组名[索引]} 定义的是哪个索引,就看到是对应索引指定的值
${数组名} 默认调用 索引=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个随机数,打印其中最大的数值
数组切片
${变量名[@]:偏移量:所需要取出值的个数}
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
name=张三
haigth=183
python ( %s ,他的升高为 %d ) % (name, hiaght)
输出: 张三,他的身高为183
%s
%d
%f
%[num]s 指定该字符串占位的宽度
%-[num]s 代表左对齐
【居中对齐】
%d
%f
%[num]s 指定该字符串占位的宽度
%-[num]s 代表左对齐
【居中对齐】
1、字符串切片:
数组切片:${变量名[@]:偏移量:数值个数}
字符串:${变量名:偏移量:数值个数}
${变量名: -数值个数} 【*注意:冒号后面一定要加空格*】
${变量名:-word} 默认赋值的意思
read "sasasa:" test
[ -z $test ] && test=abc
2、基于模式取子字符串
从左自右
${变量名#pattern} 删除pattern第一次匹配到的字串
${变量名##pattern} 删除所有pattern匹配到的字串
从右自左
${变量名%pattern}
${变量名%%pattern}
数组切片:${变量名[@]:偏移量:数值个数}
字符串:${变量名:偏移量:数值个数}
${变量名: -数值个数} 【*注意:冒号后面一定要加空格*】
${变量名:-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 , 才会替换
3、字符替换
${变量名/pattern/替换后的字符串} 【pattern并不是正则表达式,而是文件通配符】
匹配第一个pattern,来进行替换
${变量名//pattern/替换后的字符串}
匹配所有哦pattern,并进行替换
${变量名/#pattern/替换后的字符串}
指定匹配行首必须是 pattern ,才会替换
${变量名/%pattern/替换后的字符串}
指定匹配行尾必须是 pattern , 才会替换
注意: / 分隔符,不能替换为(# % 等特殊字符 ,和sed 不一样)
4、查找并删除
替换中,不指定替换字符串,即为删除
${变量名/pattern}
${变量名//pattern}
${变量名/#pattern}
${变量名/%pattern}
替换中,不指定替换字符串,即为删除
${变量名/pattern}
${变量名//pattern}
${变量名/#pattern}
${变量名/%pattern}
5、替换大小写
tr 替换大小写
tr [[:lower:]] [[:upper:]] < filename
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错误信息
变量名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 创建的就是随机的 目录
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
优点可以指定权限来复制文件
用法:intall a文件 b目录 //复制a文件到b目录,并回复初始权限(文件:755 目录:644)
-t 源目对换
-d 创建
-m MODE
-o OWNER
-g GROUP