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全解析:字符串变量和数组变量的主要内容,如果未能解决你的问题,请参考以下文章