Linux Shell入门学习(三)

1. Shell数组

若干个数据构成的集合,在编程语言上称之为数组。和大多数编程语言一样,shell同样也支持数组。并且也可以用[]加下标来访问数组里的数据,数组下标从0开始。但是shell中的数组和其他编程语言(例如C语言)中的数组又有一些不同之处,主要有如下:

  1. 定义数组时不用指明数组的大小。
  2. 数组中的数据可以是不同类型的,例如可以将浮点型和整型存放在同一个数组里。
  3. shell中的数组只支持一维数组,不支持多维数组。

2. 数组的定义

在shell当中用()代表一个数组,括号里面的数据则是数组里的元素。数组的定义如下:

num=(1,2,3.0,4.0)
num2=(1 2 3.0 4.0)

元素与元素之间即可以使用逗号来隔开,也可以使用空格来隔开。
也可以用下面这种方式来定义数组:

num[0]=1
num[1]=2
num[2]=3.0
num[3]=4.0

上面这种方式也起到了定义num数组的作用,但是这种方式显然没有第一种方式来的便捷。一般第二种方式只有在修改,增加,读取数组的元素时才会使用。定义数组还是以第一种为准。
前面说到,shell数组是可以存放不同类型数据的,从上面的定义中已经可以直观的看出。

3. 访问数组元素

shell数组中访问数组元素的方法也是用[]加下标的方式来访问。下面通过几个简单的小例子来看看如何访问数组的元素。

#!/bin/bash
num=(1 3 5 7)
echo "first num:${num[0]}"
echo "second num:${num[1]}"
echo "third num:${num[2]}"
echo "fourth num:${num[3]}"

运行脚本得到输出为:

first num:1
second num:3
third num:5
fourth num:7

也可以通过下标修改某个元素或增加元素:

#!/bin/bash
num=(1 3 5 7)
echo "first num:${num[0]}"
echo "second num:${num[1]}"
echo "third num:${num[2]}"
echo "fourth num:${num[3]}"
num[0]=2
num[4]=10
echo "first num:${num[0]}"
echo "second num:${num[1]}"
echo "third num:${num[2]}"
echo "fourth num:${num[3]}"
echo "fifth num:${num[4]}"

结果如下:

first num:1
second num:3
third num:5
fourth num:7
first num:2
second num:3
third num:5
fourth num:7
fifth num:10

在C语言中,在访问数组元素时,如果下标越界会产生段错误,程序崩溃。但是在shell中即使下标越界也没有关系,不存在的元素会输出空。
在访问数组元素时,向上面那样通过一个下标一个下标的来访问貌似有些繁琐。所以在shell中可以使用@或者*来访问数组中的所有元素。

#!/bin/bash
num=(1 2 3 4)
echo ${num[*]}
echo ${num[@]}

输出:
1 2 3 4
1 2 3 4
那么这两种方式获取数组元素是否是完全等效的呢?答案是否定的,他俩之前还有细微的差别。这个放到最后来说。

4. 获取数组的长度

@和*可以将数组扩展成列表,在shell中再使用#来获取数组的长度,即元素的个数。

#!/bin/bash
num=(1 2 3 4 5)
echo ${#num[*]}

输出

5

5. @和*的区别

@和*的区别就在于当给变量加上“”时,使用星号会把这个数组当成一个字符串来处理,而使用@则还是当做数组处理。当变量不加“”时,这两种方式也都还是一样的。看下面这个例子:

#!/bin/bash 
num=(1 2 3)
echo "@有引号"
for a in "${num[@]}"
do
echo $a
done
 
echo "*有引号"
for a in "${num[*]}"
do
echo $a
done

输出如下:

@有引号
1
2
3
*有引号
1 2 3

可以看到,当加上引号后,使用@访问数组的元素依旧被当做数组一个元素一个元素的输出,但是使用*访问数组的元素时,则将1 2 3当成一个字符串来输出。

6. Shell字符串

字符串在shell脚本中是非常常用的类型。定义字符串时,字符串即可以由单引号包围,也可以由双引号包围,也可以不要引号。

str1=www.baidu.com
str2="www.baidu.com"
str3='www.baidu.com'

上例中分别是三种方式定义了三个字符串。
不同的定义方式也会存在一些区别。

  1. 由双引号包围的字符串中如果包含了变量,那么该变量是可以被解析的,并且字符串中也可以包含双引号,但是双引号之前需要加入转义符号。
  2. 由单引号包围的字符串会原样输出,如果包含了变量,该变量不会被解析,而且字符串不能出现单引号。
  3. 不被引号包围的字符串如果包含了变量,该变量也可以被解析,但是字符串不能包含空格。
    下面通过一个例子来看一下三种方式的区别:
#!/bin/bash
money=100
str1=ihave${money} 
str2="i have ${money}"
str3='i have ${money}'
echo $str1
echo $str2
echo $str3

输出:

ihave100
i have 100
i have ${money}

可以看到str1在定义时不能包含空格,且str3是被单引号包围的,里面包含的变量money没有被解析。

想要获取字符串的长度也非常简单,方法和获取数组的长度一样的,使用#符号即可。

#!/bin/bash
str="hello world"
echo ${#str}

输出

11

7. 字符串的拼接

在shell中的字符串拼接非常简单,只要将两个字符串并排写在一起就可以了。前面介绍了三种定义字符串的方式,单引号,双引号,无引号,由于这个差别,所以在定义新的字符串保存拼接的字符串时会有一些区别。

  1. 当不用引号包围新的字符串时:
str1=www
str2=baidu
str3=${str1}${str2}
str4=${str1} ${str2} #error  中间有空格
  1. 当使用双引号包围新的字符串时:
str1=www
str2=baidu
str3="${str1}${str2}"
str4="${str1} ${str2}" #correct 可以包含空格,以及其他字符
  1. 当使用单引号包围新的字符串时:
str1=www
str2=baidu
str3='${str1}${str2}'

输出str3如下:

${str1}${str2}

原样输出,没有完成拼接。前面说过,单引号里的变量是不会被解析的。
如果要使用单引号,那需要被要拼接的字符串变量放在引号外,如下:

str1=www
str2=baidu
str3=${str1}':'${str2}

输出str3:

www:baidu

这样才完成了拼接。

8. 获取子字符串

shell中获取子字符串有两种截取方式,一是从指定位置截取,二是从指定字符开始截取。不管哪种方式都有从左边和从右边截取两种方式。先看从指定位置截取。
从指定位置且从左边截取的一般形式:

${string:strart:length}

从指定位置且从右边截取的一般形式:

${string:0-start:length}

其中string表示将要被截取的字符串,start为开始的位置,length为要截取的长度。
另外从左边和从右边截取还有一点不同就是从左边截取下标从0开始计算,从右边截取下标从1开始计算。

#!/bin/bash
string="hello world"
echo ${string:3:3} #从左边截取,下标从0开始第三个,即从第二个l开始
echo ${string:0-3:3} #从右边截取,下标从1开始第三个,即从r开始截取

输出:

lo
rld

再看一下从指定字符开始截取,也有两个方向。
从左边截取:(截取chars右边的字符)

${string#*chars}

从右边开始截取:(截取chars左边的字符)

${string%chars*}

string表示将要被截取的字符串,chars表示指定的字符,*表示通配符,会匹配任意个任意字符。

#!/bin/bash
string="www:baidu.com"
echo ${string#*:}
echo ${string%:*}

输出:

baidu.com   #匹配到:,截取其右边的字符
www       #匹配到:,截取其左边的字符
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值