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