shell 基本数据类型

Posted 我的紫霞辣辣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell 基本数据类型相关的知识,希望对你有一定的参考价值。

基本数据类型与值操作

shell的基本数据类型

在shell语法中,单引号和双引号是不同的。

""  弱引用,引号的特殊字符有意义
''	强引用,引号内所有的特殊字符都取消意义

[root@m01 ~]# name="nana"
[root@m01 ~]# echo "${name} is beautiful gril"
nana is beautiful gril
[root@m01 ~]# echo '${name} is beautiful gril'
${name} is beautiful gril

数组分为两种

普通数组:索引取值

关联属组:key:value取值,需要用declare -A声明

- 普通数组
定义的方式一:
[root@m01 ~]# id=(nana 18 female)
取值
[root@m01 ~]# echo ${id}			# 默认取第一个值
nana
[root@m01 ~]# echo ${id[1]}
18
[root@m01 ~]# echo ${id[2]}
female

定义的方式二:
[root@m01 ~]# id_a=([0]=111 [1]="two" [2]=333)
取值
[root@m01 ~]# echo ${id_a[0]}
111
[root@m01 ~]# echo ${id_a[1]}
two
[root@m01 ~]# echo ${id_a[2]}
333

定义的方式三:
[root@m01 ~]# id_new[0]=111
[root@m01 ~]# id_new[1]=aaa
[root@m01 ~]# id_new[2]="six six six"
取值
[root@m01 ~]# echo ${id_new[0]}
111
[root@m01 ~]# echo ${id_new[1]}
aaa
[root@m01 ~]# echo ${id_new[2]}
six six six

定义的方式四:
[root@m01 ~]# ls /test
a.txt  b.txt
[root@m01 ~]# array=(`ls /test`)
取值
[root@m01 ~]# echo ${array[0]}
a.txt
[root@m01 ~]# echo ${array[1]}
b.txt
[root@m01 ~]# declare -a | grep array
declare -a array='([0]="a.txt" [1]="b.txt")'

查看声明过的数组
[root@m01 ~]# declare -a

=======================访问普通数组======================
[root@m01 ~]# a=(1 2 3)
正向索引
[root@m01 ~]# echo ${a[0]}
1
[root@m01 ~]# echo ${a[1]}
2
[root@m01 ~]# echo ${a[2]}
3

负向索引
[root@m01 ~]# echo ${a[-1]}
3
[root@m01 ~]# echo ${a[-2]}
2
[root@m01 ~]# echo ${a[-3]}
1
- 关联数组
[root@m01 ~]# declare -A input
[root@m01 ~]# input["name"]="nana"
[root@m01 ~]# input["age"]=18
[root@m01 ~]# input["gender"]="female"
[root@m01 ~]# declare -A | grep input
declare -A input='([gender]="female" [name]="nana" [age]="18" )'

=======================访问关联数组======================
[root@m01 ~]# echo ${input[*]}
female nana 18
[root@m01 ~]# echo ${input["name"]}
nana

变量值操作

获取变量值的长度

统计变量msg变量中包含的字符数量
[root@m01 ~]# msg='hello world'
方法一:
[root@m01 ~]# echo ${#msg}		
11

方法二:
[root@m01 ~]# echo $msg | wc -L
11

方法三:
[root@m01 ~]# echo $msg | awk '{print length}'
11

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

切片

shell切片默认步长为1,无法指定步长

[root@m01 ~]# msg=abcde
[root@m01 ~]# echo ${msg:2}				# 从2号索引开始,一直到最后
cde
[root@m01 ~]# echo ${msg:2:3} 			 # 从2号索引开始,往后数3个字符
cde
[root@m01 ~]# echo ${msg::3}  			# 从0开始,往后数3个字符
abc

截断

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

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

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

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

非贪婪
[root@m01 ~]# echo ${url%.*}
www.sina.com

贪婪
[root@m01 ~]# echo ${url%%.*}
www

内容的替换

[root@m01 ~]# url="www.baidu.com.cn"
[root@m01 ~]# echo ${url/baidu/sina}
www.sina.com.cn
[root@m01 ~]# echo ${url/w/W}
Www.baidu.com.cn
[root@m01 ~]# echo ${url//w/W}				  # 贪婪
WWW.baidu.com.cn

# 应用示例:批量修改文件名称
[root@m01 ~]# touch nana_2021_{1..5}.txt
[root@m01 ~]# ls
nana_2021_1.txt  nana_2021_3.txt  nana_2021_5.txt
nana_2021_2.txt  nana_2021_4.txt  
[root@m01 ~]# for i in `ls nana_2021_*.txt`;do mv $i ${i/txt/log};done
[root@m01 ~]# ls
nana_2021_1.log  nana_2021_2.log  nana_2021_3.log  nana_2021_4.log  nana_2021_5.log

变量的替代

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

1、${parameter-word}: 当调取变量没有定义过, 就返回word字符串信息
[root@m01 ~]# unset name
[root@m01 ~]# echo ${name}

[root@m01 ~]# echo ${name-"nana"}   		# 没有定义过变量name,则使用-后的值nana
nana
[root@m01 ~]# gender=						 # 定义过变量了,则使用变量的原值,哪怕变量的值为空值
[root@m01 ~]# echo ${gender-"male"}

[root@m01 ~]# age=18
[root@m01 ~]# echo ${age-19}				 # 定义过变量了,则使用变量的原值
18

2、${parameter:-word}: 当调取变量信息值为空时或未定义变量, 就返回word字符串信息
[root@m01 ~]# unset a
[root@m01 ~]# unset b
[root@m01 ~]# unset c
[root@m01 ~]# echo ${x:-aaa}  			# 没有定义过变量a,则使用-后的值
aaa

[root@m01 ~]# y=
[root@m01 ~]# echo ${y:-aaa}			  # 定义过变量y,但变量y的值为空值,则使用-后的值
aaa

[root@m01 ~]# c=333
[root@m01 ~]# echo ${c:-aaa}	 		 # 定义过变量了,并且变量有一个非空的原值,则使用变量的原值
333

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

4、${parameter:?word}:当调取变量信息值为空时或未定义,指定为赋值的错误提示信息
[root@m01 ~]# echo ${x:?}
123
[root@m01 ~]# unset x
[root@m01 ~]# echo ${x:?}
-bash: x: parameter null or not set

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

[root@m01 ~]# x=666
[root@m01 ~]# echo ${x:+哈哈哈}
哈哈哈

let

1. 变量的值
[root@m01 ~]# a=1
[root@m01 ~]# let ++a
[root@m01 ~]# echo $a
2

2. 表达式的值
[root@m01 ~]# unset a
[root@m01 ~]# unset b
[root@m01 ~]# a=1
[root@m01 ~]# b=1
[root@m01 ~]# let x=a++			 # 先把a的值赋值给x,再++
[root@m01 ~]# let y=++b			 # 先++b,然后再把b的结果赋值给y
[root@m01 ~]# echo $a
2
[root@m01 ~]# echo $b
2
[root@m01 ~]# echo $x
1
[root@m01 ~]# echo $y
2

取命令的结果赋值给变量

 ``与$()
` `命令替换等价于$(),反引号中的shell命令会被先执行
[root@m01 ~]# touch `date +%F`1.txt
[root@m01 ~]# touch $(date +%F)2.txt
[root@m01 ~]# ls
2021-06-161.txt  2021-06-162.txt 

以上是关于shell 基本数据类型的主要内容,如果未能解决你的问题,请参考以下文章

shell 基本数据类型

shell编程之基本数据类型与值操作

Bash的变量类型

代码片段:Shell脚本实现重复执行和多进程

02 python基本语法和数据类型

系统管理:shell基本命令1