shell字符串数组
Posted 不懂123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell字符串数组相关的知识,希望对你有一定的参考价值。
数组
声明数组
declare -a ARRAY_NAME
declare -A ARRAY_NAME: 关联数组
注意:两者不可相互转换
数组名和下标(索引)
索引:编号从0开始,属于数值索引
注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引, bash4.0版本之后开始支持
bash的数组支持稀疏格式(索引不连续)
数组赋值
(1) 一次只赋值一个元素
ARRAY_NAME[INDEX]=VALUE weekdays[0]="Sunday" weekdays[4]="Thursday"
(2) 一次赋值全部元素
ARRAY_NAME=("VAL1" "VAL2" "VAL3" ...)
1 filename=(`ls /root/*.sh`) 2 3 echo ${filename[@]} 4 /root/99.sh /root/a.sh /root/b.sh /root/caluid.sh /root/creat10user.sh /root/diskcheck.sh /root/g1.sh /root/getuserinfo.sh /root/guess.sh /root/selectmenu.sh /root/shift.sh /root/testfor.sh /root/trap.sh /root/whiledf.sh
(3) 只赋值特定元素
ARRAY_NAME=([0]="VAL1" [3]="VAL2" ...)
(4) 交互式数组值对赋值 read -a ARRAY
引用数组
${ARRAY_NAME[INDEX]} 注意:省略[INDEX]表示引用下标为0的元素
引用数组所有元素:
${ARRAY_NAME[*]} ${ARRAY_NAME[@]}
数组的长度(数组中元素的个数):
${#ARRAY_NAME[*]} ${#ARRAY_NAME[@]}
删除数组中的某元素: 导致稀疏格式 unset ARRAY[INDEX]
删除整个数组: unset ARRAY
数组切片
引用数组中的元素:
数组切片:${ARRAY[@]:offset:number}
offset: 要跳过的元素个数
number: 要取出的元素个数 取偏移量之后的所有元素 ${ARRAY[@]:offset}
向数组中追加元素: ARRAY[${#ARRAY[*]}]=value
字符串
字符串切片的示例
1 [root@centos7 ~]# str=`echo {a..z}|tr -d " "` 2 [root@centos7 ~]# echo $str 3 abcdefghijklmnopqrstuvwxyz 4 [root@centos7 ~]# str2=`echo {a..z}` 5 [root@centos7 ~]# echo $str2 6 a b c d e f g h i j k l m n o p q r s t u v w x y z 7 [root@centos7 ~]# echo ${#str} 8 26 9 [root@centos7 ~]# echo ${#str2} 10 51 11 [root@centos7 ~]# echo ${str:3} 12 defghijklmnopqrstuvwxyz 13 [root@centos7 ~]# echo ${str:3:4} 14 defg 15 [root@centos7 ~]# echo ${str: -4} 16 wxyz 17 [root@centos7 ~]# echo ${str: -4:-2} 18 wx 19 [root@centos7 ~]# echo ${str: -4:1} 20 w 21 [root@centos7 ~]# echo ${str: -4:3} 22 wxy
字符串模式取子字符串
1 [root@centos7 ~]# line=`head -n1 /etc/passwd` 2 [root@centos7 ~]# echo $line 3 root:x:0:0:root:/root:/bin/bash 4 [root@centos7 ~]# echo ${line#*:} 5 x:0:0:root:/root:/bin/bash 6 [root@centos7 ~]# echo ${line##*:} 7 /bin/bash 8 [root@centos7 ~]# echo ${line%*:} 9 root:x:0:0:root:/root:/bin/bash 10 [root@centos7 ~]# echo ${line%:*} 11 root:x:0:0:root:/root 12 [root@centos7 ~]# echo ${line%%:*} 13 root 14 [root@centos7 ~]# disk="/dev/sda3 30G 82M 30G 1% /data" 15 [root@centos7 ~]# echo $disk 16 /dev/sda3 30G 82M 30G 1% /data 17 [root@centos7 ~]# echo ${disk%% *} 18 /dev/sda3 19 [root@centos7 ~]#
字符串的搜索替代
${var/pattern/substr}:查找var所表示的字符串中,第一次被pattern所匹 配到的字符串,以substr替换之
${var//pattern/substr}: 查找var所表示的字符串中,所有能被pattern所匹 配到的字符串,以substr替换之
${var/#pattern/substr}:查找var所表示的字符串中,行首被pattern所匹 配到的字符串,以substr替换之
${var/%pattern/substr}:查找var所表示的字符串中,行尾被pattern所匹 配到的字符串,以substr替换之
字符串的搜索删除
${var/pattern}:删除var所表示的字符串中第一次被pattern所匹配到的字符串
${var//pattern}:删除var所表示的字符串中所有被pattern所匹配到的字符串
${var/#pattern}:删除var所表示的字符串中所有以pattern为行首所匹配到的字符串
${var/%pattern}:删除var所表示的字符串中所有以pattern为行尾所匹配到的字符串
字符大小写转换
${var^^}:把var中的所有小写字母转换为大写
${var,,}:把var中的所有大写字母转换为小写
eval命令
eval 首先会扫描替换命令中的所有变量,然后再去执行替换后的命令
eval 命令将会首先扫描命令行进行所有的置换,然后再执行该命令.该命令适用于那些一次扫描无法实现其功能的变量.该命令对变量进行两次扫描
1 [root@centos7 ~]# n=10 2 [root@centos7 ~]# echo {1..$n} 3 {1..10} 4 [root@centos7 ~]# eval echo {1..$n} 5 1 2 3 4 5 6 7 8 9 10 6 [root@centos7 ~]# CMD=whoami 7 [root@centos7 ~]# echo $CMD 8 whoami 9 [root@centos7 ~]# eval $CMD 10 root 11 [root@centos7 ~]#
变量赋值方式
以上是关于shell字符串数组的主要内容,如果未能解决你的问题,请参考以下文章