Shell全解析:字符串变量和数组变量

Posted 毛奇志

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell全解析:字符串变量和数组变量相关的知识,希望对你有一定的参考价值。

文章目录

一、前言

本文主要介绍Shell脚本中的字符串变量和数组变量。

Shell中数组类型只要记住就是字符串和数组就好了,基本可以完成所有的工作,开始吧。

二、Shell字符串变量

2.1 单引号、双引号和反引号

shell中存在三种引号,单引号’',双引号""和反引号``。

先说单引号’'和双引号"",如下:

相同点:两者都是解决变量中间有空格的问题。因为在bash中“空格”是一种很特殊的字符,比如在bash中这样定义str=this is String,这样就会报错,为了避免出错就得使用单引号’'和双引号""。

不同点:单引号’‘,双引号""的区别是单引号’‘剥夺了所有字符的特殊含义,单引号’'内就变成了单纯的字符。双引号"“则对于双引号”"内的参数替换($)和命令替换(``)是个例外。例如输入:

n=3
echo '$n'


再看反引号, 反引号是命令替换,命令替换是指Shell可以先执行``中的命令,将输出结果暂时保存,在适当的地方输出。下面的例子中,将命令执行结果保存在变量中:

#!/bin/bash

DATE=`date`
echo "Date is $DATE"

UP=`date ; uptime`
echo "Uptime is $UP"

小结:反引号的核心作用是命令替换,包裹着要执行的命令,包裹着英文分号是换行。
单引号和双引号两种不同:
双引号里可以识别变量,单引号里不可以识别变量;
双引号里可以识别转义字符,单引号里不可以识别转义字符。

2.2 字符串三种形式

Shell中,字符串包括三种形式:没有引号、单引号、双引号,如下:

your_name="runoob"
echo $your_name

# 这里会被解释为一个被双引号包裹的字符串,加$符号的变量会被读取
str="Hello, I know you are $your_name! \\n"
echo $str

# 这里会被解释为两个双引号字符串拼接,即""+变量+"",加$符号的变量会被读取
str="Hello, I know you are "$your_name"! \\n"
echo $str

# 引号无法解释变量的
str='Hello, I know you are "$your_name"! \\n'
echo $str

# 双引号内部可以加转义字符,转义双引号为普通字符,而不是被解释为双引号字符串拼接
str="Hello, I know you are \\"$your_name\\"! \\n"
echo $str

str="Hello, I know you are '$your_name'! \\n"
echo $str

str="Hello, I know you are \\'$your_name\\'! \\n"
echo $str

2.3 字符串变量赋值与读取

echo $a
echo a

a=b
echo $a

2.4 字符串拼接

your_name="runoob"

# 不使用引号,则赋值号右边的字符串中不能包含空格,因为不能包含空格,但是$符号
# 默认是空格确定变量名的,如果变量名后面还是字符串,要读取的变量必须加上
greeting_0=hello,$your_name
echo $greeting_0
# $符号默认是空格确定变量名的,如果变量名后面还是字符串,要读取的变量必须加上
greeting_0=hello,$your_name!
echo $greeting_0

# 使用双引号拼接
greeting_1="hello, "$your_name" !"
greeting_2="hello, "$your_name" !"
greeting_3="hello, $your_name !"
greeting_4="hello, $your_name !"
echo $greeting_1
echo $greeting_2
echo $greeting_3
echo $greeting_4


# 使用单引号拼接
greeting_5='hello, '$your_name' !'
greeting_6='hello, '$your_name' !'
greeting_7='hello, $your_name !'
greeting_8='hello, $your_name !'
echo $greeting_5  
echo $greeting_6
echo $greeting_7
echo $greeting_8

2.5 获取字符串长度

在字符串前面加上 # 号,就可以获取字符串长度,不需要调用方法

string="abcd"
echo $#string   # 输出 4
echo $#string[0]   # 输出 4

2.6 提取子字符串

第一个字符的索引值为 0,例如,从字符串第 2 个字符开始截取 4 个字符:

string=“runoob is a great site”
echo $string:1:4 # 输出 unoo

三、shell数组

bash仅支持一维数组,不支持多维数组,可以不使用连续的下标,并且没有限定数组的大小,就是数组是不定长的,可以无限在后面元素。数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。

3.1 数组定义

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

数组名=(值1 值2 ... 值n)

例如:

array_name=(value0 value1 value2 value3)

或者

array_name=(
value0
value1
value2
value3
)

还可以单独定义数组的各个分量:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

3.2 数组赋值

很简单,就是

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

3.3 数组读取

读取数组元素值的一般格式是:

$数组名[下标]

例如:

valuen=$array_name[n]

使用 @ 符号可以获取数组中的所有元素,也可以用 * 获取数组中所有元素,例如:

echo $array_name[@]
echo $array_name[*]

3.4 获取数组长度

获取数组长度的方法与获取字符串长度的方法相同,就是数组变量名前面加上一个#,例如:

实例

# 取得数组元素的个数
length=$#array_name[@]
# 或者
length=$#array_name[*]
# 取得数组单个元素的长度
lengthn=$#array_name[n]

数组定义、赋值、读取、计算长度,如下:


小结:在Shell中,对于数组的操作包括:
(1) 数组元素写的是时候,直接后面加上赋值号和常量/变量就好了。
(2) 数组元素读的时候,需要在数组元素上面包裹上一层 $ 才可以读取到元素
特殊地,获取整个数组中全部元素,就将方括号中下标数字变为@*,即$array_name[@] $array_name[*] 一般用在for var in array 循环中,这里的array需要得到数组所有元素。
(3) 获取单个数组长度,在数组元素上面包裹上一层 $#,获取整个数组长度(整个数组元素个数),即$#array_name[@] $#array_name[*] ,一般在 for ((i=0;i<$#array[*];i++)) 被使用到。

四、shell注释

shell有两种注释方式,
(1) 行前面加上 # ,会被认为是注释,会被解释器忽略。
(2) 使用 :<< 注释,如下:

:<<EOF
注释内容...
注释内容...
注释内容...
EOF

EOF 也可以使用其他符号:

实例
:<<'
注释内容...
注释内容...
注释内容...
'
:<<!
注释内容...
注释内容...
注释内容...
!

五、尾声

本文主要介绍了Shell脚本中的字符串变量和数组变量。

天天打码,天天进步!!

以上是关于Shell全解析:字符串变量和数组变量的主要内容,如果未能解决你的问题,请参考以下文章

shell_数组与字符串

Shell全解析:Shell脚本程序

shell基础知识---与监听服务器长连接端口状态

shell的循环

18 shell脚本--009数组与字符串

Shell脚本超全详解