【Shell编程】3.Shell字符串、Shell数组

目录

Shell字符串

代码1

test3_1.sh

运行

结果

获取字符串长度

代码2

test3_2.sh

运行

结果

Shell字符串拼接

代码3

test3_3.sh

运行

结果

Shell字符串截取

从指定位置开始截取

从字符串左边开始计数

从字符串右边开始计数

从指定字符开始截取

使用#号截取右边字符

使用%号截取左边字符

代码4

test3_4.sh

运行

结果

Shell数组的定义

获取数组元素

代码5

test3_5.sh

运行

结果

Shell获取数组长度

代码6

test3_6.sh

运行

结果

Shell数组拼接、合并

代码7

test3_7.sh

运行

结果

Shell删除数组元素

代码8

test3_8.sh

运行

结果

Shell关联数组

代码9

test3_9.sh

运行

结果

Shell字符串

字符串可以由单引号' '包围,也可以由双引号" "包围,也可以不用引号。

str1=aaaaa
str2='bbbbb'
str3="ccccc"

三种形式的区别:

  1. 不被引号包围的字符串:不被引号包围的字符串中出现变量时也会被解析;字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。

  2. 由单引号包围的字符串:任何字符都会原样输出,在其中使用变量是无效的;字符串中不能出现单引号,对单引号进行转义也不行。

  3. 由双引号" "包围的字符串: 如果其中包含了某个变量,那么该变量会被解析,得到该变量的值,而不是原样输出;字符串中可以出现双引号。

代码1

test3_1.sh

#!/bin/bash

num=20
str1=aaa$numaa
str2='bbb$num bb'
str3="ccc$num \"cc\""

echo $str1
echo $str2
echo -e $str3

给予可执行权限。

chmod 777 test3_1.sh

 

运行

./test3_1.sh 

结果

获取字符串长度

${#字符串名}
${#string_name}

代码2

test3_2.sh

#!/bin/bash

str="abcdefg :/"

echo ${#str}

 给予可执行权限。

chmod 777 test3_2.sh

 

运行

./test3_2.sh

结果

 

Shell字符串拼接

将两个字符串并排放在一起就能实现拼接。

代码3

test3_3.sh

#!/bin/bash

Str1="你好,"
Str2="世界!"

str1=$Str1$Str2      #中间不能有空格
str2="$Str1 $Str2"   #如果被双引号包围,那么中间可以有空格
str3=$Str1": "$Str2  #中间可以出现别的字符串
str4="$Str1: $Str2"  #这样写也可以
str5="${Str1}aaa ${Str2}bbb"  #这个时候需要给变量名加上大括号

echo $str1
echo $str2
echo $str3
echo $str4
echo $str5

给予可执行权限。

chmod 777 test3_3.sh

 

运行

./test3_3.sh

结果

 

Shell字符串截取

Shell截取字符串通常有两种方式:从指定位置开始截取和从指定字符(子字符串)开始截取。

从指定位置开始截取

       这种方式需要两个参数:除了指定起始位置,还需要截取长度,才能最终确定要截取的字符串。

       既然需要指定起始位置,那么就涉及到计数方向的问题,到底是从字符串左边开始计数,还是从字符串右边开始计数。答案是Shell同时支持两种计数方式

  • 从左边开始计数时,起始数字是0(这符合程序员思维);从右边开始计数时,起始数字是1(这符合常人思维)。计数方向不同,起始数字也不同。

  • 不管从哪边开始计数,截取方向都是从左到右。

从字符串左边开始计数

${字符串: 起始位置: 截取长度}
${string: start: length}

       string是要截取的字符串,start是起始位置(从左边开始,从0开始计数),length是要截取的长度(省略的话表示直到字符串的末尾)。

从字符串右边开始计数

${字符串: 0-从右边数截取的起始位置: 截取长度}
${string: 0-start: length}

从指定字符开始截取

        这种截取方式无法指定字符串长度,只能从指定字符(子字符串)截取到字符串末尾。Shell 可以截取指定字符(子字符串)右边的所有字符,也可以截取左边的所有字符。

使用#号截取右边字符

使用#号可以截取指定字符(或者子字符串)右边的所有字符。

${字符串#*子字符串}
${string#*chars}

       string表示要截取的字符,chars是指定的字符(或者子字符串),*是通配符的一种,表示任意长度的字符串。*chars连起来使用的意思是:忽略左边的所有字符,直到遇见chars(chars不会被截取)。

使用%号截取左边字符

使用%号可以截取指定字符(或者子字符串)左边的所有字符。

${字符串%子字符串*}
${string%chars*}

         注意*的位置,因为要截取chars左边的字符,而忽略chars右边的字符,所以*应该位于chars的右侧。

代码4

test3_4.sh

#!/bin/bash

str1="aaabbbccc aaabbbccc"
echo -e "str1=${str1}\n"

echo "-----------------左边开始计数截取字符串-----------------"
echo ${str1: 2: 9}
echo -e "--------------------------------------------------------\n"

echo "-----------左边开始计数截取字符串,省略length-----------"
echo ${str1: 2}
echo -e "--------------------------------------------------------\n"

echo "-----------------右边开始计数截取字符串-----------------"
echo ${str1: 0-13: 9}
echo -e "--------------------------------------------------------\n"

echo "-----------右边开始计数截取字符串,省略length-----------"
echo ${str1: 0-13}
echo -e "--------------------------------------------------------\n"

echo "------------------使用#号截取右边字符-------------------"
echo "使用#*,匹配到第一个就结束:${str1#*bb}"
echo "使用##*,匹配到最后一个结束:${str1##*bb}"
echo -e "--------------------------------------------------------\n"

echo "------------------使用%号截取左边字符-------------------"
echo "使用%*,匹配到最后一个结束:${str1%bb*}"
echo "使用%%*,匹配到第一个就结束:${str1%%bb*}"
echo -e "--------------------------------------------------------\n"

给予可执行权限。

chmod 777 test3_4.sh

运行

./test3_4.sh

结果

Shell数组的定义

数组名=(元素1 元素2 元素3 ... 元素n)
array_name=(ele1  ele2  ele3 ... elen)
  1. 常用的Bash Shell只支持一维数组,不支持多维数组。Shell数组元素的下标也是从0开始计数。

  2. 在Shell中,用括号( )来表示数组,数组元素之间用空格来分隔。

  3. Shell是弱类型的,它并不要求所有数组元素的类型必须相同。

  4. Shell数组的长度不是固定的,定义之后还可以增加元素。

  5. 无需逐个元素地给数组赋值。

注意:赋值号=两边不能有空格,必须紧挨着数组名和数组元素。

获取数组元素

获取数组元素的值。

${数组名[下标]}
${array_name[index]}

array_name是数组名,index是下标。

使用@或*可以获取数组中的所有元素。

代码5

test3_5.sh

#!/bin/bash

ShuZu1=(29 100 13 "你好,世界!" 91 44)
echo "ShuZu1:${ShuZu1[@]}"                #输出所有数组元素
ShuZu1[10]=66                           #给第10个元素赋值(此时会增加数组长度)
echo "增加元素,ShuZu1:${ShuZu1[*]}"      #输出所有数组元素
echo "第3个元素:${ShuZu1[3]}"            #输出第3个元素

给予可执行权限。

chmod 777 test3_5.sh 

 

运行

./test3_5.sh

结果

Shell获取数组长度

利用@或*,可以将数组扩展成列表,然后使用#来获取数组元素的个数。

${#数组名[@]}
${#数组名[*]}
${#array_name[@]}
${#array_name[*]}

代码6

test3_6.sh

#!/bin/bash

ShuZu=(29 100 13)
echo ${#ShuZu[*]}

#向数组中添加元素
ShuZu[10]="你好,世界!"
echo ${#ShuZu[@]}
echo ${#ShuZu[10]}

#删除数组元素
unset ShuZu[1]
echo ${#ShuZu[*]}

给予可执行权限。

chmod 777 test3_6.sh

运行

./test3_6.sh

结果

Shell数组拼接、合并

       Shell数组拼接(数组合并),将两个数组连接成一个数组。拼接数组的思路是:先利用@或*,将数组扩展成列表,然后再合并到一起。

数组=(${数组1[@]} ${数组2[@]})
数组=(${数组1[*]} ${数组2[*]})
array_new=(${array1[@]}  ${array2[@]})
array_new=(${array1[*]}  ${array2[*]})

array1和array2是需要拼接的数组,array_new是拼接后形成的新数组。

代码7

test3_7.sh

#!/bin/bash

ShuZu1=(23 56)
ShuZu2=(99 "你好,世界!")
ShuZu=(${ShuZu1[@]} ${ShuZu2[*]})
echo ${ShuZu[@]}  

给予可执行权限。

chmod 777 test3_7.sh

运行

./test3_7.sh

结果

Shell删除数组元素

在Shell中,使用unset关键字来删除数组元素。

unset 数组名[下标]
unset array_name[index]

array_name表示数组名,index表示数组下标。

删除整个数组,所有元素都会消失。

unset 数组名
unset array_name

代码8

test3_8.sh

#!/bin/bash

ShuZu=(23 56 99 "你好,世界!")
echo ${ShuZu[@]}

unset ShuZu[1]
echo ${ShuZu[@]}

unset ShuZu
echo ${ShuZu[*]}

给予可执行权限。

chmod 777 test3_8.sh 

 

运行

./test3_8.sh 

结果

 

Shell关联数组

      关联数组使用字符串作为下标,而不是整数。关联数组也称"键值对(key-value)"数组,key为下标,value为元素值。

declare -A 数组名		#声明关联数组
数组名[索引]=值		#一次赋一个值
数组名=([索引1]=值1 [索引2]=值2 [索引3]=值3)		#一次赋多个值

代码9

test3_9.sh

#!/bin/bash

declare -A GuanLian_ShuZu                #声明关联数组

GuanLian_ShuZu=([name]="张三" [sex]="男" [age]=17)
GuanLian_ShuZu[addr]="中国"
GuanLian_ShuZu[email]="xxx@mail.com"

echo "name对应的值为:${GuanLian_ShuZu[name]}"
echo "email对应的值为:${GuanLian_ShuZu[email]}"
echo "该关联数组一共有:${#GuanLian_ShuZu[@]}个元素"
echo "数组全部元素为:${GuanLian_ShuZu[*]}"
echo "数组的所有下标为:${!GuanLian_ShuZu[*]}"

 给予可执行权限。

chmod 777 test3_9.sh 

 

运行

./test3_9.sh

结果

 

  • 18
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Shell字符串数组是一种存储多个字符串的数据结构,可以通过下标访问数组中的元素,也可以通过循环遍历数组中的所有元素。在Shell脚本中,可以使用declare命令或者直接赋值的方式来创建字符串数组。例如,使用declare命令创建一个包含三个字符串数组: declare -a arr=("hello" "world" "shell") 然后可以通过下标访问数组中的元素: echo ${arr[]} # 输出hello 也可以使用循环遍历数组中的所有元素: for i in "${arr[@]}" do echo $i done 输出结果为: hello world shell ### 回答2: Shell中的字符串数组是一种特殊的变量类型,用于存储多个字符串。在Shell脚本中,字符串数组可以用于存储一系列相关的字符串,并且可以对其进行遍历、操作和处理。 定义字符串数组可以使用以下语法: ``` array=("string1" "string2" "string3") ``` 其中,array是数组的名称,而"string1"、"string2"、"string3"是数组中的元素。 也可以逐个添加元素到数组中: ``` array[0]="string1" array[1]="string2" array[2]="string3" ``` 访问数组元素可以使用以下语法: ``` element=${array[index]} ``` 其中,index是数组中元素的索引,element是获取的数组元素。 对于数组的长度,可以使用以下语法: ``` length=${#array[@]} ``` 使用这个语法,可以获取数组中元素的个数。 遍历字符串数组可以使用循环语句: ``` for element in "${array[@]}" do echo $element done ``` 这个例子中,通过遍历${array[@]},我们可以访问数组中的每个元素,并将其打印出来。 使用字符串数组,可以方便地存储和处理一系列相关的字符串数据,从而实现更加灵活和高效的脚本编写。 ### 回答3: Shell字符串数组Shell编程语言中的一种数据结构,它可以存储多个字符串,并通过索引访问和操作。在Shell中,字符串数组可以通过以下方式定义和初始化: ```bash my_array=("string1" "string2" "string3") ``` 上述代码定义了一个名为my_array的字符串数组,其中有三个元素,分别是"string1"、"string2"和"string3"。我们可以通过数组索引来访问特定的元素,如: ```bash echo ${my_array[0]} # 输出第一个元素"string1" echo ${my_array[1]} # 输出第二个元素"string2" echo ${my_array[2]} # 输出第三个元素"string3" ``` 我们还可以通过下标的方式遍历整个数组,并对每个元素进行操作,如: ```bash for element in ${my_array[@]}; do echo $element done ``` 上述代码会将数组中的每个元素逐行输出。 在Shell中,我们可以使用数组来存储需要进行批量处理的数据,方便对多个字符串进行统一操作,比如切割、连接等。同时,字符串数组还可以作为函数的参数传递,方便将多个字符串作为一个整体进行处理。总的来说,Shell字符串数组是一种非常有用的数据结构,可以简化Shell脚本编写,提高代码的可读性和维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

因心,三人水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值