Linux运维shell脚本4

37次阅读

共计 3390 个字符,预计需要花费 9 分钟才能阅读完成。

这篇主要记录下数组的使用,相比来说用得比较少,同样的根据阅读 << 跟老男孩学 Linux 运维:Shell 编程实战 >> 所记录

系列笔记传送门:

  • Linux 运维:shell 脚本(1)
  • Linux 运维:shell 脚本(2)
  • Linux 运维:shell 脚本(3)
  • Linux 运维:shell 脚本(4)

shell 数组

Shell 数组是一个元素的集合,它把有限个元素用一个名字来命名,然后用编号对所有元素进行区分。这个名字就是数组名,用于区分不同内容的编号就叫数组的下标,组成数组的各个元素就是数组的元素,也叫下标变量。

1、数组的常用操作

1.1 数组的定义

数组的定义有多种方法:

  • 1、用小括号将变量值括起来赋值给变量,每个变量值之间用空格隔开。
  • 2、用小括号将变量值括起来,同时采用键值对的形式赋值。
  • 3、通过分别定义数组变量的方法定义。
  • 4、动态定义数组变量,并使用命令的输出结果作为数组内容。

方法 1 示例:

[root@moli_linux1 ~]# array=(one two three)
[root@moli_linux1 ~]# echo ${array[*]}
one two three
[root@moli_linux1 ~]# echo ${array[0]}
one
[root@moli_linux1 ~]# echo ${array[1]}
two
[root@moli_linux1 ~]# echo ${array[2]}
three

方法 2 示例:

[root@moli_linux1 ~]# array=([1]=one [2]=two [3]=three)
[root@moli_linux1 ~]# echo ${array[*]}
one two three
[root@moli_linux1 ~]# echo ${array[1]}
one
[root@moli_linux1 ~]# echo ${array[2]}
two
[root@moli_linux1 ~]# echo ${array[3]}
three

方法 3 示例:

[root@moli_linux1 ~]# array[0]=a;array[1]=b;array[2]=c
[root@moli_linux1 ~]# echo ${array[*]}
a b c
[root@moli_linux1 ~]# 

方法 4 示例:

[root@moli_linux1 test]# touch {1..3}.txt
[root@moli_linux1 test]# ls
1.txt  2.txt  3.txt
[root@moli_linux1 test]# array=($(ls .))
[root@moli_linux1 test]# echo ${array[*]}
1.txt 2.txt 3.txt
[root@moli_linux1 test]# 

1.2 数组打印输出

  • 打印数组里面的 单个元素 的值时,使用echo ${数组名[下标值]},如果没有指定数组的下标,那么默认数组的下标从 0 开始;
  • 打印 整个 数组的值可以使用 echo ${数组名[*]} 或者echo ${数组名[@]}
[root@moli_linux1 test]$ array=(one two three)
[root@moli_linux1 test]$ echo ${array[0]}
one
[root@moli_linux1 test]$ echo ${array[1]}
two
[root@moli_linux1 test]$ echo ${array[*]}
one two three
[root@moli_linux1 test]$ echo ${array[@]}
one two three

除了打印数组的值以外,还可以输出数组元素的个数,使用 echo ${# 数组名[*]} 或者echo ${# 数组名[@]}。这与变量字串的内容是一样,数组元素也是变量,不过是特殊的变量。

[root@moli_linux1 test]$ echo ${#array[*]}
3
[root@moli_linux1 test]$ echo ${#array[@]}
3

1.3 数组的赋值

数组的赋值直接使用 数组名[下标值]=value,当下标值不存在则添加一个新的数组元素,如果下标存在则会覆盖原来的值。

[root@moli_linux1 test]$ echo ${array[*]}
one two three
[root@moli_linux1 test]$ echo ${array[1]}
two
[root@moli_linux1 test]$ array[3]=four # 进行赋值
[root@moli_linux1 test]$ echo ${array[*]}
one two three four
[root@moli_linux1 test]$ array[0]=1 # 下标已存在,覆盖下标为 0 的值
[root@moli_linux1 test]$ echo ${array[*]}
1 two three four

1.4 数组的删除

数组的本质还是变量,因此可以用 unset 数组名[下标值] 进行数组元素的删除,如果不指定下标值,而是使用 unset 数组名 则会删除整个数组。

[root@moli_linux1 test]$ echo ${array[*]}
1 two three four
[root@moli_linux1 test]$ unset array[0] # 删除下标为 0 的数组元素 1
[root@moli_linux1 test]$ echo ${array[*]} # 已删除
two three four
[root@moli_linux1 test]$ unset array # 删除整个数组
[root@moli_linux1 test]$ echo ${array[*]}  # 显示为空,已被删除

[root@moli_linux1 test]$ 

1.5 数组内容的截取与替换

数组的截取和替换与变量字串的截取和替换是一样的,直接例子吧!

[root@moli_linux1 test]# array=(1 2 3 4 5)
[root@moli_linux1 test]# echo ${array[@]:1:3} # 截取下标为 1 到 3 的元素
2 3 4
[root@moli_linux1 test]# array=($(echo {a..z})) # 将命令的结果赋值给数组
[root@moli_linux1 test]# echo ${array[*]}
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
[root@moli_linux1 test]# echo ${array[@]:1:3} # 截取下标为 1 到 3 的元素
b c d
[root@moli_linux1 test]# echo ${array[@]:0:2} 
a b
[root@moli_linux1 test]# echo ${array[@]/a/A} # 把小写字母 a 替换为大写字母 A
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

2、shell 数组开发实践

2.1 结合 for 循环打印数组元素

#!/bin/bash
echo "====No.1====="
array1=(1 2 3 4 5)
for((i=0;i<${#array1[@]};i++))
do
    echo ${array1[i]}
done

echo "====No.2===="
array2=(1 2 3 4 5)
for n in ${array2[*]}
do
    echo $n
done

执行结果:

2.2 打印下列句子中,单词字母数小于 6 的单词
句子:I am oldboy teacher welcome to oldboy training class
用数组方法实现:

#!/bin/bash
array=(I am oldboy teacher welcome to oldboy training class)
echo "====No,1===="
for((i=0;i<${#array[@]};i++))
do
    if [${#array[$i]} -lt 6 ];then # 这里使用变量字串知识进行字符串长度统计
        echo "${array[$i]}"
    fi
done

echo "====No.2===="
for word in ${array[*]}
do
    if [`expr length $word` -lt 6];then # 使用 expr 命令的 length 函数计算字符串长度
        echo $word
    fi
done

执行结果:

[root@moli_linux1 script]# sh 13_4.sh 
====No,1====
I
am
to
class
====No.2====
I
am
to
class

正文完
 0