文章目录

基本数据类型与值操作

一、 数据类型介绍

1、什么是数据?为何要有多种类型的数据?
数据即变量的值,如age=18,18则是我们保存的数据。
变量的是用来反映/保持状态以及状态变化的,毫无疑问针对不同的状态就应该用不同类型的数据去标识
[root@web ~]# x=123
[root@web ~]# echo '$x'
$x
[root@web ~]# echo "$x"
123

[root@web ~]# echo "\$x"
$x
# 双引号必须加\转移
2、shell是一门解释型、弱类型、动态语言
概括地说,编程语言的划分方式有以下三种

1、编译型or解释型

2、强类型or弱类型
2.1 强类型语言: 数据类型不可以被忽略的语言
即变量的数据类型一旦被定义,那就不会再改变,除非进行强转。
在中,例如:name = 'mm',这个变量name在被赋值的那一刻,数据类型就被确定死了,是字符型,值为'mm'。

2.2 弱类型语言:数据类型可以被忽略的语言
比如linux中的shell中定义一个变量,是随着调用方式的不同,数据类型可随意切换的那种,即shell对数据类型的概念没有那么强的要求

3、动态型or静态型
3.1 动态语言 :运行时才进行数据类型检查
即在变量赋值时,就确定了变量的数据类型,不用事先给变量指定数据类型

3.2 静态语言:需要事先给变量进行数据类型定义

所以综上所述,shell是一门解释型的弱类型动态语言

二、基本数据类型

1、数字类型

#int整型
定义:age=10
用于标识:年龄,等级,身份证号,qq号,个数

#float浮点型
定义:salary=3.1
用于标识:工资,身高,体重

2、字符串

#在shell中,加了引号的字符就是字符串类型

定义:name='mm'
用于标识:描述性的内容,如姓名,性别,国籍,种族


# 注意1:字符串包含空格必须加引号
[root@mm ~]# msg="hello mm"
[root@mm ~]# msg=hello mm
: mm: 未找到命令...

# 注意2:连续的字符不加引号包含也是可以的,但我们还是强烈建议加上引号,规范一些
[root@mm ~]# msg=hello
[root@mm ~]# echo $msg
hello
[root@mm ~]#

# 注意3:单引号与双引号是不同的
" " 弱引用,引号的特殊字符有意义
' ' 强引用,引号内所有特殊字符都取消意义
[root@mm ~]# name=“mm”
[root@mm ~]# echo "${name} is good"
mm is good
[root@mm ~]# echo '${name} is good'
${name} is good

3、shell是弱类型语言弱类型语言

[root@mm ~]# x=10
[root@mm ~]# y="3"
[root@mm ~]# expr $x + $y
13

4、数组介绍

# 1、什么是数组?
数组就是一系列元素的集合,一个数组内可以存放多个元素

# 2、为何要用数组?
我们可以用数组将多个元素汇总到一起,避免单独定义的麻烦

5、数组分为两种

- 普通数组:只能使用整数作为数组索引
- 关联数组:可以使用字符串作为数组索引,需要用declare -A声明

1、普通数组

=================声明普通数组=================
# 方式一:array=(元素1 元素2 元素3)
array=(mm 18 male)

# 方式二:array=([key1]=value1 [key2]=value2 [key3]=value3)
array=([0]=111 [1]="two" [2]=333)

# 方式三:依次赋值
array_new[0]=111
array_new[1]=222
array_new[2]="third"

# 方式四:利用执行命令的结果设置数组元素:array=($(命令)) 或者 array=(`命令`)
该方式会将命令的结果以空格为分隔符切成多个元素然后赋值给数组
[root@aliyun ~]# ls /test
a.txt b.txt
[root@aliyun ~]# array3=(`ls /test`)
[root@aliyun ~]# declare -a |grep array3
declare -a array3='([0]="a.txt" [1]="b.txt")'


# ps:查看声明过的数组
declare -a

=================访问普通数组=================
[root@web ~]# array=(mm 2021 ata)
[root@web ~]# echo ${array[0]}
mm
[root@web ~]# echo ${array[1]}
2021
[root@web ~]# echo ${array[2]}
ata

# 负向索引
[root@web ~]# echo ${array[-2]}
2021
[root@web ~]# echo ${array[-1]}
ata
[root@web ~]# echo ${array[0]}
mm

2、关联数组

=================声明关联数组=================
[root@aliyun ~]# declare -A info
[root@aliyun ~]# info["name"]="mm"
[root@aliyun ~]# info["age"]=18
[root@aliyun ~]# info["gender"]="male"
[root@aliyun ~]#
[root@aliyun ~]# declare -A |grep info
declare -A info='([gender]="male" [name]="mm" [age]="18" )'
[root@aliyun ~]# echo ${info[*]}
male mm 18
[root@aliyun ~]# echo ${info["name"]}

=================访问关联数组=================
[root@mm ~]# info=([0]="mm" ["age"]=18 ["gender"]="male")
[root@mm ~]# echo ${info[0]}
mm
[root@mm ~]# echo ${info["age"]}
18
[root@mm ~]# echo ${info["gender"]}
male
ps: shell只支持一维数组,但数组元素个数没有限制。