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

1|0基本数据类型与值操作

1|1一 、数据类型介绍

1|01、什么是数据

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

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

1|02、编程语言划分(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|2二 、基本数据类型

1|01、数字

#int(整型) 定义:age=10 用于标识:年龄,等级,身份证号,qq号,个数 #float(浮点型) 定义:salary=3.1 用于标识:工资,身高,体重

1|02、字符串

在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

1|03、数组介绍

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只支持一维数组,但数组元素个数没有限制

1|3三 、shell变量值操作

1|01、 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

1|02、 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

1|03、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

1|04、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

1|05、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:+哇哈哈哈} 哇哈哈哈

1|06、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

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

反引号``命令替换 等价于 $()
反引号中的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}'` # 正确

__EOF__

本文作者ଲ小何才露煎煎饺
本文链接https://www.cnblogs.com/zeny/p/15121527.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ଲ小何才露煎煎饺  阅读(128)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
点击右上角即可分享
微信分享提示