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 基本数据类型的主要内容,如果未能解决你的问题,请参考以下文章