shell基础语法:数据类型和结构:字符串,数组,map(关联数组)

参考:

https://zhuanlan.zhihu.com/p/289274320(shell常用数据结构)

https://www.runoob.com/linux/linux-shell-array.html(shell数组)

基本

Shell是弱类型的语言

没有向C、java那样的强类型变量,都是弱类型变量。都会统一存储为字符串类型

字符串

字符串(String)就是一系列字符的组合。字符串是 Shell 编程中最常用的数据类型之一(除了数字和字符串,也没有其他类型了)。

定义

your_name="runoob.com"

支持3种方式

name=nick
name='nick'
mame="nick"

三种形式的区别:

1) 由单引号''包围的字符串:

任何字符都会原样输出,在其中使用变量是无效的。

字符串中不能出现单引号,即使对单引号进行转义也不行。

2) 由双引号""包围的字符串:

如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出。

字符串中可以出现双引号,只要它被转义了就行。

3) 不被引号包围的字符串

不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样。

字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。

拼接字符串

your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !' #无效
echo $greeting_2  $greeting_3

#输出结果
hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !

获取字符串长度

string="abcd"
echo ${#string} #输出 4

提取部分字符

以下实例从字符串第 2 个字符开始截取 4 个字符:

string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

第一个字符的索引值为 0,包含前后两个下标

查找字符

查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):

string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4

数组

定义

#语法
数组名=(值1 值2 ... 值n)

#方法1
array_name=(value0 value1 value2 value3)

#方法2
array_name=(
value0
value1
value2
value3
)

#方法3
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

读取元素

读取一个

${数组名[下标]}
#例子 valuen
=${array_name[n]}

使用 @ 符号可以获取数组中的所有元素(待实践)

${array_name[@]} #可以使用for in变例

获取数组的长度

使用#获取长度

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

关联数组:map

使用 declare -A

bash 版本不对,需4.0以上才支持关联数组。declare -A 在低版本的bash中不支持这个功能。

定义

#方式1
declare -A m
m["zh"]="中国"

#方式2
declare -A m=(["zh"]="中国" ["cn"]="美国")

= 的前后没有任何空格, 赋值语句也是一样的. 初始化的时候是 小括号 + 空格 的方式进行初始化的

获取

${m[key]}

map的长度, 所有key, 所有value

所有的key: ${!m[@]}, 带有 !. 注意这里的结果是一个元组

所有的value: ${m[@]}, 不带 !. 注意这里的结果是一个元组

长度: ${#m[@]}, 带有的是 #

遍历key

for key in ${!m[@]}; do
    echo "key:$key"
    echo "key:$key, val:${m[$key]}"
done

遍历value

for val in ${m[@]}; do
    echo "val:$val"
done
原文地址:https://www.cnblogs.com/tkzc2013/p/15349686.html