详解shell 变量

 更新时间:2020年08月31日 14:55:35   作者:Dabelv  
这篇文章主要介绍了shell 变量的相关资料,帮助大家更好的理解和学习shell,感兴趣的朋友可以了解下

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 变量的资料请关注脚本之家其它相关文章!

相关文章

  • 一个测试下载速度的shell脚本

    一个测试下载速度的shell脚本

    这篇文章主要介绍了一个测试下载速度的shell脚本,需要的朋友可以参考下
    2014-03-03
  • 浅析Linux之bash反弹shell原理

    浅析Linux之bash反弹shell原理

    这篇文章主要介绍了浅析Linux之bash反弹shell原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Shell脚本逐行读取文本文件(不改变文本格式)

    Shell脚本逐行读取文本文件(不改变文本格式)

    这篇文章主要介绍了Shell脚本逐行读取文本文件,本文着重探讨不改变文本格式的方法读取出文件内容,需要的朋友可以参考下
    2015-04-04
  • Linux 下载百度网盘大文件的方法

    Linux 下载百度网盘大文件的方法

    Linux 下没有百度网盘客户端,用浏览器下载速度慢得急死人,本文重点给大家介绍Linux 下载百度网盘大文件的方法,需要的朋友参考下吧
    2017-08-08
  • linux中scp命令和scp命令用法大全

    linux中scp命令和scp命令用法大全

    scp是linux中功能最强大的文件传输命令,可以实现从本地到远程以及远程到本地的轻松文件传输操作,本文给大家分享linux中scp命令和scp命令用法大全,需要的朋友可以参考下
    2015-09-09
  • Linux文件的归档和压缩命令

    Linux文件的归档和压缩命令

    文件归档命令tar,文件归档有好多好处,方便使用易于管理,接下来通过本文给大家分享linux文件的归档和压缩命令,感兴趣的朋友一起看看吧
    2017-08-08
  • 批量修改ssh配置的expect脚本

    批量修改ssh配置的expect脚本

    公司服务器一般通过ssh进行远程管理。以前大家登录的时候,都是随意选内外网IP进入。王总接手后,说这事隐患太大了,必须禁了外网ssh
    2013-03-03
  • 阿里云云服务器Linux系统更新yum源Shell脚本

    阿里云云服务器Linux系统更新yum源Shell脚本

    这篇文章主要介绍了阿里云云服务器Linux系统更新yum源Shell脚本,阿里云自建了一个包含大多数系统更新的本地yum源,速度快又好用,需要的朋友可以参考下
    2014-09-09
  • 复制 Windows cmd 窗口命令行的信息方法

    复制 Windows cmd 窗口命令行的信息方法

    下面小编就为大家带来一篇复制 Windows cmd 窗口命令行的信息方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • expect实现批量修改linux密码脚本分享

    expect实现批量修改linux密码脚本分享

    这篇文章主要介绍了expect实现批量修改Linux密码脚本分享,本文直接给出实现代码,需要的朋友可以参考下
    2014-12-12

最新评论