shell—数组
本文最后更新于 209 天前,如有失效请评论区留言。

Auther | CuckooYang

数组

什么是数组?
数组也是一种变量,常规变量只能保存一个值,数组可以保存多个值

#普通数组:只能用整数作为数组的索引--0  下标
#关联数组:可以使用字符串作为数组的索引

定义数组

普通数组定义:
[root@linux-server script]# books=( linux shell awk sed ) ---在python中叫列表

引用:${array_name[index]} #引用 

[root@linux-server script]# echo ${books[0]}
linux
[root@linux-server script]# echo ${books[1]}
shell
[root@linux-server script]# echo ${books[2]}
awk

#关联数组需要提前声明
Declare命令:
[test @test test]# declare [-选项]
参数说明:
-a :#定义为数组(普通数组)--array
-A : #定义关联数组

例1
declare -A myarry1
[root@linux-server script]# declare -A myarry1
[root@linux-server script]# myarry1=([name]=soso666 [sex]=man [age]=18)
[root@linux-server script]# echo ${myarry1[name]}
soso666
[root@linux-server script]# echo ${myarry1[age]}
18
定义方法1:定义一个普通数组
[root@linux-server script]# declare -a myarry=(5 6 7 8)
[root@linux-server script]# echo ${myarry[2]}
显示结果为 7

定义方法2:
    # array=( one two three four five six )
    # array2=(tom jack alice)
    # array3=(`cat /etc/passwd`) #是将文件中的“每一行作为一个值”赋给数组array3
    # array4=(tom jack alice "bash shell") #引号中的表示数组的一个元素
    # array5=(1 2 3 4 5 6 7 "linux shell" [20]=saltstack)

定义方法3: 定义数组内部的某一个元素
#语法:数组名[index]=变量值
#!/bin/bash 
area[11]=23 
area[13]=37 
area[51]="UFO"

示例
[root@linux-server script]# vim shuzu.sh
#!/bin/bash
NAME[0]="BJ"
NAME[1]="SH"
NAME[2]="SZ"
NAME[3]="GZ"
NAME[4]="HZ"
NAME[5]="ZZ"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"
echo "sixth Index: ${NAME[5]}"

输出结果
[root@linux-server script]# bash shuzu.sh 
First Index: BJ
Second Index: SH
sixth Index: ZZ

访问数组

当设置任何数组变量时,可以访问它

@  所有元素
*  
#@ 所有元素的个数
!@ 打印索引
[root@linux-server script]# aa=(haha heihei baibai)
[root@linux-server script]# echo ${aa[0]}   #访问数组中的第一个元素
[root@linux-server script]# echo ${aa[@]}   #访问数组中所有的元素 等同与echo ${aa[*]} 
[root@linux-server script]# echo ${#aa[@]}  #统计元素的个数 
[root@linux-server script]# echo ${!aa[@]}  #打印索引

您可以访问数组中的所有项目通过以下方式之一:

${array_name[*]} 取得数组中所有元素,当成一个字符处理
${array_name[@]} 取得数组中所有元素,当作数组处理

示例

[root@linux-server script]# vim shuzu1.sh
#!/bin/sh
NAME[0]="BJ"
NAME[1]="SH"
NAME[2]="SZ"
NAME[3]="GZ"
NAME[4]="HZ"
echo "${NAME[*]}"
echo "${NAME[@]}"

输出结果

[root@linux-server script]# bash shuzu1.sh 
BJ SH SZ GZ HZ
BJ SH SZ GZ HZ

疑难点
shell数组中"*" 和 "@" 区别

关于在shell脚本中数组变量中 “ * ”跟 “ @ ” 区别
*当变量加上"" 会当成一串字符串处理. 
@当变量加上"" 依然当做数组处理. 
 在没有加上"" 的情况下与“@”效果是等效的.

示例 :在不加“ ”的情况下,@和*没有区别,在加了“ ”的情况下,二者不一样

[root@linux-server script]# vim test1.sh
#!/usr/bin/env bash
array=(gz cloud 19)
echo "case 1"
for line in "${array[@]}"       # array[@]加引号,依然当成数组处理(for循环了三次)
do
        echo $line
done

echo "case 2"
for line in "${array[*]}"       # array[*]加引号,会当成一串字符串处理(相当于for就循环了一次)
do
        echo $line
done

echo "case 3"
for line in ${array[*]}         # array[*]不加引号,则和array[@]不加引号效果一样(for循环了三次)
do
        echo $line
done

echo "case 4"
for line in ${array[@]}         # array[@]不加引号,则和array[*]不加引号效果一样(for循环了三次)
do
        echo $line
done

执行结果

[root@linux-server script]# bash test1.sh 
case 1
gz
cloud
19
case 2
gz cloud 19     #这里被当做字符串处理了,故相当于echo打印了一个“gz cloud 19”字符串
case 3
gz
cloud
19
case 4
gz
cloud
19
【普通数组索引】:
遍历数组while
---比较擅长处理行,不管有没有空格都算作是一行
将一个文件中的每一行作为数组的元素赋值给数组并遍历  (行——元素——数组)

[root@newrain array]# cat array01.sh 
#!/bin/bash
# ++i:是先自加1后赋值;
# i++:是先赋值后自加1;
# i不定义默认值0
while read line   #数组赋值(while循环,每次读一行/etc/hosts文件的值)
do
        host[i++]=$line  #数组的定义(写法之一)
done </etc/hosts
echo
for i in ${!host[@]}     #数组遍历,建议使用索引遍历
do
        echo "$i:${host[i]}"  #打印索引号及host数组内容
done

【普通数组索引】:
遍历数组for
[root@newrain array]# cat array02.sh 
#!/bin/bash
#IFS=$'\n'
for line in `cat /etc/hosts`
do
        host[j++]=$line
done
for  i in ${!host[@]}
do
        echo ${host[i]}
done 
#注意:for循环中会将tab\空格\回车作为分隔符默认为空格.

【扩展】:
Shell 脚本中有个变量叫IFS(Internal Field Seprator) ,内部域分隔符。IFS是一个变量,当shell处理"命令替换"和"参数替换"时,shell根据IFS的值,默认是space, tab, newline来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量。
使用方式:
OLD_IFS=$IFS #先保存原始值
IFS="\n"  #改变IFS的值
...
...
IFS=$OLD_IFS #如果用的时候在还原IFS的原始值

【关联数组索引】:
练习:通过数组统计shell的种类和数量--/etc/passwd
#把要统计的对象作为数组的索引,最后对他们的值进行累加--必须为关联数组
[root@localhost ~]# vim count_shells.sh
#!/usr/bin/bash
declare -A shells   #定义为关联数组
while read line
do
        type=`echo $line | awk -F":" '{print $NF}'`
        let shells[$type]++   #匹配到之后加1
done < /etc/passwd
for i in ${!shells[@]}
do
        echo "$i: ${shells[$i]}"  #数组名加上索引统计出值
done

数组遍历最主要的是遍历数组的索引,通过遍历数组索引来echo出数组元素。(在这里我们平时可能会用到普通数组的索引,也可能用到关联数组的索引)

正则表达式RE

正则表达式(regular expression, RE)是一种字符模式,用于在查找过程中匹配指定的字符。在大多数程序里,正则表达式都被置于两个正斜杠之间,例如/l[oO]ve/就是由正斜杠界定的正则表达式,它将匹配被查找的行中任何位置出现的相同模式。在正则表达式中,元字符是最重要的概念。正则表达式分为:

  • 正则表达式基本元字符
  • 正则表达式拓展元字符

元字符使正则表达式具有处理能力,所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

基本元字符

基本正则表达式元字符

元字符                    功能                       示例
-------------------------------------------------------------------
^                       行首定位符                  ^love 
$                       行尾定位符                  love$ 
.                       匹配单个字符                 l..e  
*                       匹配前导符0到多次            ab*love 
.*                      匹配任意多个字符(贪婪匹配)    ab.*love
[]                      匹配方括号中任意一个字符       [lL]ove
[ - ]                   匹配指定范围内的一个字符       [a-z0-9]ove             
[^]                     匹配不在指定组里的字符         [^a-z0-9]ove
\                       用来转义元字符               love\.
\<                      词首定位符                   \<love
\>                      词尾定位符                  love\>
\(\)                    匹配后的标签

拓展元字符

扩展正则表达式元字符             功能                  示例
+                       匹配一次或多次前导字符        [a-z]+ove
?                       匹配零次或一次前导字符        lo?ve
a|b                     匹配a或b                   love|hate
x{m}                    字符x重复m次               o{5}
x{m,}                   字符x重复至少m次            o{5,}
x{m,n}                  字符x重复m到n次             o{5,10}
()                      字符组                     love(able|rs)ov ov+ (ov)+

正则判断

[root@linux-server ~]# num1=1 
#运用正则,判断需要[[ ]]
[root@linux-server ~]# [[ $num1 =~ ^[0-9]+$ ]] && echo "yes" || echo "no"
yes
#注意:^在[]内表示取反,^在[]外表示以什么开头
[root@linux-server ~]# num3=1b1 
[root@linux-server ~]# [[ $num3 =~ ^[0-9]+$ ]] && echo "yes" || echo "no"
no

[root@linux-server ~]# num=1.6
[root@linux-server ~]# [[ $num =~ ^[0-9]\.[0-9]+$ || $num =~ ^[0-9]+$ ]] && echo "yes" || echo "no"       //输入的只能是数字(包括小数)
yes
[root@linux-server ~]# num=12.6
[root@linux-server ~]# [[ $num =~ ^[0-9]\.[0-9]+$ || $num =~ ^[0-9]+$ ]] && echo "yes" || echo "no"
no
[root@linux-server ~]# num=12.6
[root@linux-server ~]# [[ $num =~ ^[0-9]+\.[0-9]+$ || $num =~ ^[0-9]+$ ]] && echo "yes" || echo "no"
yes

---END

版权声明:除特殊说明,博客文章均为cuckooyang原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。 | 博客订阅:RSS | 广告招租:留言板 | 博客VPS |
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇