shell中的$取变量操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell中的$取变量操作相关的知识,希望对你有一定的参考价值。

$ A=`echo -e "B\nC"`
$ echo $A
B C
$ echo "$A"
B
C
1、为什么这里使用$A与"$A"的结果不一样?
2、
>te=1
>echo "$te"和echo "$te"是等价的?
谢谢!
“echo "$temp"和echo "$temp"则不等价了”
怎么不等价呢?

1,echo $A只是输出变量的值而已,其中的转义字符(如\n)需要在双引号中才能生效
所以输出会不一样,一个是有转义字符的,一个是没有转义字符的
2,你写的两条命令是等价的,但是
echo "$temp"和echo "$temp"则不等价了,这既是这种参数扩展的用处

加入
te = a;
temp=b;
那么:
$temp=amp;
$temp=b;
所以echo "$temp"结果是amp
而echo $temp结果是b;
这样说能明白吗?举个例子,如果你要批量给.jpg的文件命名,如果直接使用$temp.jpg那么就会有问题,因为这时候取的是temp.jpg看成一个变量,所以就要用$temp.jpg才是取temp变量的值
参考技术A Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言,涵盖的知识点多且杂,却是云计算开发人员必须要掌握的技术之一。接下来就给大家梳理一下Shell变量相关的知识。

Linux Shell中的变量可以被指定为任意的数据类型,比如文本字符串或者数值。你也可以通过修改Shell中的变量来改变Shell的样式。

Shell支持三种定义变量的方式:
variable=value
variable='value'
variable="value"
variable是变量名,value是赋给变量的值。如果value不包含任何空白符(例如空格、Tab缩进等),那么可以不使用引号;如果value包含了空白符,那么就必须使用引号包围起来。注意,赋值号=的周围不能有空格。
Shell变量的命名规范和大部分编程语言一样:变量名由数字、字母、下划线组成;必须以字母或者下划线开头;不能使用Shell里的关键字(通过help命令可以查看保留关键字)。

Linux中Shell变量分为系统变量和用户自定义变量,系统变量包括$HOME、$PWD、$SHELL、$USER、echo $SHELL以及显示当前Shell中所有变量set。

Shell自定义变量包括1)定义变量:变量=值;2)撤销变量:unset变量;3)声明静态变量:readonly变量,注意不能unset;4)使用export把变量提升为全局环境变量,如/etc/profile中的TOMCAT_HOME变量,且在另外的/opt/tmp/shell/myShell.sh脚本中使用该环境变量。

Shell设置环境变量
基本语法:
1)export:变量名=变量值(功能描述:将shell变量输出为环境变量)
2)source:配置文件(功能描述:让修改后的配置文件立即生效)
3)echo:$变量名(功能描述:查询环境变量的值)
单行注释:#
多行注释::<<!需要注释的内容!

Shell脚本很适合处理纯文本类型的数据,而Linux中几乎所有的配置文件、日志文件(如NFS、Rsync、Httpd、nginxmysql等),以及绝大多数的启动文件都是纯文本类型的文件。Shell是运维人员必须要掌握的技能,此外还需要掌握Linux、信息安全、Docker容器等。

linux12shell编程 -->变量值操作

基本数据类型与值操作

三、变量值操作

1、获取变量值的长度

[root@web ~]# echo ${#url}
15

# 企业面试题:已知变量name="mm2021",请统计出变量中包含的字符数量
# 方法一:
[root@web ~]# echo ${#name}
6
# 方法二:
[root@mm /]# echo $name | wc -L
11
# 方法三:
[root@mm /]# echo $name|awk '{print length}'
11
# 方法四:
[root@mm ~]# expr length "$name" #length是一个函数,注意因为msg的值有空格,所以$msg必须用引号包含
12

2、切片

${paramter:offset:length}
[root@web ~]# msg="mm2021"

[root@web ~]# echo ${msg}
mm2021
[root@web ~]# echo ${msg:2}    # 从2号索引开始,一直到最后
2021
[root@web ~]# echo ${msg:2:3}  # 从3号索引开始,往后数2个字符
202  
de
[root@mm /]# echo ${msg::3}  # 从0开始,往后数3个字符
021

3、截断

# =================》一、砍掉左边的字符《=================
# 1.1 简单使用 
[root@web ~]# url="www.jd.com"
[root@web ~]# echo ${#url}
10

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

# 1.3 结合*=》贪婪,尽可能地多“吃”字符

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

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

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

# =================》三、应用示例《=================
[root@mm ~]# hostname
mm.xxx.com
[root@mm ~]# echo $HOSTNAME
mm.xxx.com
[root@mm ~]# echo ${HOSTNAME%.*}
mm.xxx
[root@mm ~]# echo ${HOSTNAME%%.*}
mm

4、内容的替换

[root@web ~]# a="www.mm.com.mc"
[root@web ~]# echo ${a/m/M}
www.Mm.com.mc
[root@web ~]# echo ${a//m/M}
www.MM.coM.Mc   #贪婪

# 应用示例:批量修改文件名称
[root@web ~]# touch mm_2021_{01..03}_linux12.txt
[root@web ~]# ll
-rw-r--r-- 1 root root   0 May 31 21:31 mm_2021_01_linux12.txt
-rw-r--r-- 1 root root   0 May 31 21:31 mm_2021_02_linux12.txt
-rw-r--r-- 1 root root   0 May 31 21:31 mm_2021_03_linux12.txt
[root@mm shell]# for i in `ls *linux12.txt`;do mv $i ${i/_linux12/};done
[root@web ~]# ll
-rw-r--r-- 1 root root   0 May 31 21:31 mm_2021_01.txt
-rw-r--r-- 1 root root   0 May 31 21:31 mm_2021_02.txt
-rw-r--r-- 1 root root   0 May 31 21:31 mm_2021_03.txt

5 、变量的替代

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


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

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

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

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

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

#4、${parameter:?word}:当调取变量信息值为空时或未定义,指定为赋值的错误提示信息
[root@mm /]# unset x
[root@mm /]# echo ${x:?该变量没有定义过}
-: x: 该变量没有定义过
        
#5、${parameter:+word}:当调取变量信息值为空时或未定义,不做任何处理,否则word字符串将替代变量值
[root@mm /]# unset x
[root@mm /]# echo ${x:+哈哈哈}

[root@mm /]# x=123
[root@mm /]# echo ${x:+哈哈哈}
哈哈哈

6、let

# (1) 变量的值
[root@mm ~]# j=1
[root@mm ~]# let ++x
[root@mm ~]# echo $j
2
[root@mm ~]# 

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

7、 取命令的结果赋值给变量:

# ``与$()
` `  命令替换 等价于 $() 反引号中的shell命令会被先执行
[root@web ~]# touch `date +%F`_file1.txt  
[root@web ~]# touch $(date +%F)_file2.txt 

[root@web ~]# disk_free3="df -Ph |grep '/$' |awk '{print $4}'"  # 错误
[root@web ~]# disk_free4=$(df -Ph |grep '/$' |awk '{print $4}') # 正确
[root@web ~]# disk_free5=`df -Ph |grep '/$' |awk '{print $4}'`  # 正确

以上是关于shell中的$取变量操作的主要内容,如果未能解决你的问题,请参考以下文章

shell 怎么取远程服务器的变量值

1.Linux Shell中的变量

在Shell中怎样对一个变量取绝对值

linux12shell编程 -->变量值操作

shell 脚本如何提取整数部分

linux mysql操作