详解shell 变量

 更新时间:2020年9月1日 08:18  点击:1858

1.简介

变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据。脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,Shell变量也遵循这个规则。

在Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。这意味着,Bash shell 在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串,这一点和大部分的编程语言不同。如C/C++ ,变量分为整数、浮点数、字符串、布尔等多种类型。当然,如果有必要,你也可以使用declare/typeset Shell内建命令显式定义变量的类型,但在一般情况下没有这个需求,Shell 开发者在编写代码时自行注意值的类型即可。

2.变量类型

Shell中按照变量的作用域和生命周期,Shell变量可分为四大类:

(1)永久环境变量:需要修改配置文件,变量永久生效。

(2)临时环境变量:使用export命令行声明即可,变量在Shell脚本进程结束后仍然有效,但在关闭当前Shell会话后失效。

(3)全局变量:在脚本中定义,仅在当前Shell脚本中有效,其他Shell脚本进程不能访问,其作用域从定义的位置开始,到脚本结束或被显示删除的地方为止。注意,全局变量既可以在Shell函数内定义,也可以在Shell函数外定义,因为Shell函数内定义的变量默认为global,且作用域从“函数被调用时执行变量定义的地方”开始,到脚本结束或被显示删除的地方为止。

#!/bin/bash

globalVar=dablelv	#全局变量

(4)局部变量。在Shell脚本中函数内显示使用local关键字定义的变量。其作用域局限于函数内。同名local变量会屏蔽global变量。

#!/bin/bash

function test()
{
	local localVar=dablelv	#局部变量
}
test
echo $localVar			 	#输出为空

3.定义变量

Shell 支持以下三种定义变量的方式:

var=value
var='value'
var="value"

var是变量名,value是赋给变量的值。如果value不包含任何空白符(例如空格、Tab等),那么可以不使用引号;如果value 包含了空白符,那么就必须使用引号包围起来。使用单引号和使用双引号也是有区别的,稍后我们会详细说明。注意,赋值号的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样。

Shell变量的命名规范和大部分编程语言都一样:
(1)变量名由数字、字母、下划线组成;
(2)必须以字母或者下划线开头;
(3)不能使用Shell里的关键字(通过help命令可以查看保留关键字)。

变量定义示例:

name='dablelv'
home="安徽"
age=28

4.访问变量

使用一个定义过的变量,只要在变量名前面加美元符号$即可,如:

name="dablelv"
echo $name
echo ${name}

变量名外面的花括号{}是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

skill="Java"
echo "I am good at ${skill}Script"

如果不给skill变量加花括号,解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。

推荐给所有变量加上花括号{ },这是个良好的编程习惯。

5.修改变量的值

已定义的变量,可以被重新赋值,如:

name='dablelv'
echo $name
name="billwong"

第二次对变量赋值时不能在变量名前加,只有在使用变量时才能加,只有在使用变量时才能加,只有在使用变量时才能加。

6.单引号和双引号的区别

定义变量时,变量的值可以由单引号包围,也可以由双引号包围,它们到底有什么区别呢?不妨以下面的代码为例来说明:

#!/bin/bash

name='dablelv'
str1='我的名字是${name}'
str2="我的名字是${name}"
echo $str1
echo $str2

运行结果:

我的名字是${name}
我的名字是dablelv

以单引号包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景。

以双引号包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。

建议:如果变量的内容是数字,那么可以不加引号;如果真的需要原样输出就加单引号;其他没有特别要求的字符串等最好都加上双引号,定义变量时加双引号是最常见的使用场景。

7.将命令的结果赋值给变量

Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式:

variable=`command`
variable=$(command)

第一种方式把命令用反引号包围起来,反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式;第二种方式把命令用$()包围起来,区分更加明显,所以推荐使用这种方式。

例如将两个数值相加赋给某一变量。

var1=1
var2=2
varAdd1=`expr $var1 + $var2`
varAdd2=$(expr $var1 + $var2)

8.只读变量

使用readonly命令,或者使用declare -rtypeset -r可以将变量定义为只读变量,只读变量的值不能被改变。

name="dablelv"
readonly name

declare -r name="dablelv"

typeset -r name="dablelv"

9.删除变量

使用unset内置命令可以删除变量。语法:

unset variable_name

unset命令不能删除只读变量。变量被删除后不能再次使用。如

#!/bin/bash

name="dablelv"
unset name
echo $name

上面的脚本没有任何输出。

以上就是详解shell 变量的详细内容,更多关于shell 变量的资料请关注猪先飞其它相关文章!

[!--infotagslink--]

相关文章

  • PHP成员变量获取对比(类成员变量)

    下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • php webshell下直接反弹shell的例子

    webshell对于我们站长来讲肯定听到比较多了,我们网站可能经常被人使用期webshell方式注入一些东西了,下面一起来看一个php webshell下直接反弹shell的例子,具体如下。...2016-11-25
  • R语言 如何删除指定变量或对象

    这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • Powershell实现编写和运行脚本

    本文为那些对学习 Windows PowerShell 命令行和脚本编写环境感兴趣的系统管理员提供了资源。也请告诉我们本网站如何才能对您更有用处。...2020-06-30
  • 解决vue的router组件component在import时不能使用变量问题

    这篇文章主要介绍了解决vue的router组件component在import时不能使用变量问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27
  • Vue select 绑定动态变量的实例讲解

    这篇文章主要介绍了Vue select 绑定动态变量的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-23
  • Shell脚本中让进程休眠的方法(sleep用法)

    这篇文章主要介绍了Shell脚本中让进程休眠的方法,本文讲解的就是sleep的用法,可以实现睡觉若干秒、若干分钟、若干小时,需要的朋友可以参考下...2020-07-11
  • 深入理解PHP变量的值类型和引用类型

    在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型,在使用的时候,需要注意这一点。看到网友在讨论PHP的&符号,要彻底理解它的用法,就有必要讨论一下变量的两种形式。PHP的变量在内存中是这样...2015-10-23
  • java中String类型变量的赋值问题介绍

    下面小编就为大家带来一篇java中String类型变量的赋值问题介绍。小编觉得挺不错的。现在分享给大家,给大家一个参考。...2016-03-28
  • Linux 下使用shell脚本定时维护数据库的案例

    这篇文章主要介绍了Linux 下使用shell脚本定时维护数据库,本文通过案例分析给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • shell脚本实战-while循环语句

    这篇文章主要介绍了shell脚本实战-while循环语句,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-09
  • C#不同类型的成员变量(字段)的默认值介绍

    虽然C#编译器为每个类型都设置了默认类型,但作为面向对象的设计原则,我们还是需要对变量进行正确的初始化。实际上这也是C#推荐的做法...2020-06-25
  • Shell字符串比较相等、不相等方法小结

    这篇文章主要介绍了Shell字符串比较相等、不相等方法小结,本文直接给出代码,但代码中含有大量注释,需要的朋友可以参考下...2020-07-11
  • shell中的for循环用法详解

    这篇文章主要介绍了shell中的for循环用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-11
  • 自动设置安卓手机wifi代理的PowerShell脚本

    这篇文章主要介绍了自动设置安卓手机wifi代理的PowerShell脚本,帮助大家进行抓包测试,感兴趣的朋友可以了解下...2020-10-17
  • PowerShell中使用Get-Date获取日期时间并格式化输出的例子

    这篇文章主要介绍了PowerShell中使用Get-Date获取日期时间并格式化输出的例子,本文讲解了直接调用Get-Date、在Write-Host中使用Get-Date、格式化输出的方法,需要的朋友可以参考下...2020-06-30
  • 详解ES6实现类的私有变量的几种写法

    这篇文章主要介绍了详解ES6实现类的私有变量的几种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-10
  • python 实现循环定义、赋值多个变量的操作

    这篇文章主要介绍了python 实现循环定义、赋值多个变量的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • PowerShell读取文件内容、替换文件内容、读取限定行的例子

    这篇文章主要介绍了PowerShell读取文件内容、替换文件内容、读取限定行的例子,本文使用3个例子来说明实现这3个需求的操作技巧,需要的朋友可以参考下...2020-06-30