03@shell数据类型及变量值的操作总结

基本数据类型与值操作

一 、数据类型介绍

1、什么是数据

变量的是用来反映/保持状态以及状态变化的,毫无疑问针对不同的状态就应该用不同类型的数据去标识

数据即变量的值,如age=18,18则是我们保存的数据

2、编程语言划分(shell的划分)

shell是一门解释型、弱类型、动态语言

编译型与解释型在这里插入图片描述

#概括地说,编程语言的划分方式有以下三种

1)编译型or解释型
  1》对于编译型语言,开发完成以后需要将所有的源代码都转换成可执行程序,比如 Windows 下的.exe文件,可执行程序里面包含的就是机器码。只要我们拥有可执行程序,就可以随时运行,不用再重新编译了,也就是“一次编译,无限次运行”
  2》对于解释型语言,每次执行程序都需要一边转换一边执行,用到哪些源代码就将哪些源代码转换成机器码,用不到的不进行任何处理。每次执行程序时可能使用不同的功能,这个时候需要转换的源代码也不一样





2)强类型or弱类型
  1》强类型语言: 数据类型不可以被忽略的语言,即变量的数据类型一旦被定义,那就不会再改变,除非进行强转在python中
#例如:name = 'egon',这个变量name在被赋值的那一刻,数据类型就被确定死了,是字符型,值为'egon'。
  2》弱类型语言:数据类型可以被忽略的语言,比如linux中的shell中定义一个变量,是随着调用方式的不同,数据类型可随意切换的那种,即shell对数据类型的概念没有那么强的要求





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



#总节:shell是一门解释型的弱类型动态语言

二 、基本数据类型

1、数字

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


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

2、字符串

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

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



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


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

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



#shell是弱类型语言
[root@egon ~]# x=10
[root@egon ~]# y="3"
[root@egon ~]# expr $x + $y
13

3、数组介绍

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

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

数组的分类:

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

1)普通数组

=================声明普通数组=================
# 方式一:array=(元素1 元素2 元素3)
array=(egon 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@egon ~]# ip_array=(1.1.1.1 2.2.2.2 3.3.3.3)

# 正向索引
[root@egon ~]# echo ${ip_array[0]}
1.1.1.1
[root@egon ~]# echo ${ip_array[1]}
2.2.2.2
[root@egon ~]# echo ${ip_array[2]}
3.3.3.3
[root@egon ~]# 

# 负向索引
[root@egon ~]# echo ${ip_array[-1]}
3.3.3.3
[root@egon ~]# echo ${ip_array[-2]}
2.2.2.2
[root@egon ~]# echo ${ip_array[-3]}
1.1.1.1

2)关联数组

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

=================访问关联数组=================
[root@egon ~]# info=([0]="egon" ["age"]=18 ["gender"]="male")
[root@egon ~]# echo ${info[0]}
egon
[root@egon ~]# echo ${info["age"]}
18
[root@egon ~]# echo ${info["gender"]}
male
[root@egon ~]# 


ps:bash shell只支持一维数组,但数组元素个数没有限制

三 、shell变量值操作

1、 shell中获取变量值的长度

#语法使用
变量url=www.baidu.com
[root@localhost ~]# echo ${#url}  
13

# 企业面试题:已知变量msg='hello world!',请统计出变量中包含的字符数量
# 方法一:
[root@egon /]# echo ${#msg}
12


# 方法二:
[root@egon /]# echo $msg | wc -L
12

# 方法三:
[root@egon /]# echo $msg|awk '{print length}'
12

# 方法四:
[root@egon ~]# expr length "$msg"   #length是一个函数,注意因为msg的值有空格,所以$msg必须用引号包含
12

2、 shell切片

#shell切片语法格式:
${paramter:offset:length}

[root@web01 ~]#  hzl="abcdefg"
[root@web01 ~]# echo ${hzl:3}     #表示从第3个字符开始,一直数到最后
defg

[root@web01 ~]# echo ${hzl:3:2}    #表示从第3个字符索引开始,往后数2个字符
de
[root@web01 ~]# echo ${hzl::3}     #从0开始,往后数3个字符
abc

3、shell截断

# =================》一、砍掉左边的字符《=================
1# 简单使用 
[root@web01 ~]# url="www.sina.com.cn"
[root@web01 ~]# echo ${url#www.}
sina.com.cn

2#结合*=》非贪婪,默认情况下*是非贪婪,尽可能地少“吃”字符
[root@web01 ~]# echo ${url#*w}
ww.sina.com.cn

3# 结合*=》贪婪,尽可能地多“吃”字符
[root@web01 ~]# echo ${url##*w}  # *会尽可能多地吃掉字符,一直匹配到最远的那个w才停下来
.sina.com.cn


# =================》二、砍掉右边的字符《=================
1# 简单使用
[root@web01 ~]# url="www.sina.com.cn"
[root@web01 ~]# echo ${url%.cn}
www.sina.com

2# 结合*=》非贪婪
[root@web01 ~]# echo ${url%.*}
www.sina.com
# 1.3 结合*=》贪婪
[root@web01 ~]# echo ${url%%.*}
www



# =================》三、应用示例《=================
[root@web01 ~]# hostname
egon.xxx.com
[root@egon ~]# echo $HOSTNAME
egon.xxx.com
[root@web01 ~]# echo ${HOSTNAME%.*}    #表示从右边开始切掉右边到点的部分
egon.xxx
[root@web01 ~]# echo ${HOSTNAME%%.*}   #表示从右边开始切掉所有到点位置的部分
egon

4、shell中内容的替换

 url="www.sina.com.cn"
[root@web01 ~]# echo ${url/sina/baidu}
www.baidu.com.cn
[root@hzl ~]# echo ${url/n/N}      #从做到右边开始,替换第一个
www.siNa.com.cn
[root@hzl ~]# echo ${url//n/N}     #贪婪替换所有
www.siNa.com.cN



#----------- 应用示例:(批量修改文件名称)
[root@hzl shell]# touch egon_2020_{01..05}_linux.txt
[root@hzl shell]# ls
egon_2020_01_linux.txt  egon_2020_02_linux.txt  egon_2020_03_linux.txt  egon_2020_04_linux.txt  egon_2020_05_linux.txt

[root@hzl shell]# for i in `ls *linux.txt`;do mv $i ${i/_linux/};done           #替换所有的文件名称(循环)
[root@hzl shell]# ls
egon_2020_01.txt  egon_2020_02.txt  egon_2020_03.txt  egon_2020_04.txt  egon_2020_05.txt

5、shell 变量的替代

未定义的变量使用:
${x:-临时变量信息}
${x:=新的变量信息}
${x:?没有设置变量提示信息}
${x:+有设置变量提示信息}

1#${parameter-word}: 当调取变量没有定义过, 就返回word字符串信息
[root@hzl ~]# unset name 
[root@hzl ~]# echo ${name}
          #没有定义过变量,取值为空
[root@hzl ~]# echo ${name-"egon"}    #没有定义过变量name,则使用-后的值  
egon
[root@hzl ~]# 

[root@hzl ~]# gender=         #定义过变量了,则使用变量的原值,哪怕变量的值为空值
[root@hzl ~]# echo ${gender-"male"}
            #定义过了变量,重新设定,则变量取值不改变
[root@hzl ~]# 
[root@hzl ~]# age=18  
[root@hzl ~]# echo ${age-19}    #定义过变量了,则使用变量的原值
18
[root@egon ~]# 






2#${parameter:-word}: 当调取变量信息值为空时或未定义变量, 就返回word字符串信息
[root@hzl ~]# unset x   #删除变量x
[root@hzl ~]# unset y
[root@hzl ~]# unset z
[root@hzl ~]#
[root@hzl ~]# echo ${x:-aaa}  # 没有定义过变量x,则使用-后的值
aaa
[root@hzl ~]# y=       #定义变量y=为空
[root@hzl ~]# echo ${y:-aaa}  # 定义过变量y,但变量y的值为空值,则使用-后的值
aaa
[root@hzl ~]# z=333
[root@hzl ~]# echo ${z:-aaa}  # 定义过变量了,并且变量有一个非空的原值,则使用变量的原值
333




3#{parameter:=word}:当调取变量信息值为空时或未定义,则设置指定字符串为新的变量值
[root@hzl /]# unset x
[root@hzl /]# echo ${x:=123}
123
[root@hzl /]# echo $x
123





4#${parameter:?word}:当调取变量信息值为空时或未定义,指定为赋值的错误提示信息
[root@web01 ~]# unset x
[root@web01 ~]# echo ${x:?变量没定义}      #未定义变量,指定显示的结果(相反则不显示)
-bash: x: 变量没定义

        





5#${parameter:+word}:当调取变量信息值为空时或未定义,不做任何处理,否则word字符串将替代变量值
[root@hzl /]# unset x     
[root@hzl /]# echo ${x:+哇哈哈哈哈}   

[root@hzl /]# x=123              #定义过变量后,指定变量的取值(相反这不显示)
[root@hzl /]# echo ${x:+哇哈哈哈}
哇哈哈哈

6、let的使用(运算)

1#变量的值
[root@web01 ~]# j=1
[root@web01 ~]# let ++j     #使用++j加一
[root@web01 ~]# echo $j
2
[root@web01 ~]# 
[root@web01 ~]# let --j     #使用--j减一
[root@web01 ~]# echo $j
1
[root@web01 ~]# 






2# 表达式的值
[root@egon ~]# unset i
[root@egon ~]# unset j
[root@egon ~]# 
[root@egon ~]# i=1
[root@egon ~]# j=1
[root@egon ~]# 
[root@egon ~]# let x=i++  # 先把i赋值给x,然后再++
[root@egon ~]# let y=++j  # 先++j,然后再把j的结果赋值给y
[root@egon ~]# echo $i
2
[root@egon ~]# echo $j
3
[root@egon ~]# echo $x
1
[root@egon ~]# echo $y
2

7、 取命令的结果赋值给变量(反引号`` 与 $())

反引号``命令替换 等价于 $()
反引号中的shell命令会被先执行


[root@localhost ~]# touch `date +%F`_file1.txt  
[root@localhost ~]# touch $(date +%F)_file2.txt 

[root@localhost ~]# disk_free3="df -Ph |grep '/$' |awk '{print $4}'"  # 错误
[root@localhost ~]# disk_free4=$(df -Ph |grep '/$' |awk '{print $4}') # 正确
[root@localhost ~]# disk_free5=`df -Ph |grep '/$' |awk '{print $4}'`  # 正确
posted @ 2021-06-16 17:55  ଲ一笑奈&何  阅读(118)  评论(0编辑  收藏  举报