Shell的变量

前言:文章中所阐述的关于Shell编程语言的语法都是对于Bash Shell而言的。

一. 定义变量

       在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。

        当然,如果有必要,你也可以使用 declare 关键字显式定义变量的数据类型。

1. 变量名的命名规则

(1)变量名可以由字母、数字、以及下划线组成;

(2)变量名必须以字母或者下划线开头;

(3)不能使用Shell的关键字作为变量名;

2. 定义变量的三种语法格式

(1)变量名=变量的值 
(2)变量名='变量的值'
(3)变量名="变量的值"

3. 说明

(1)赋值号=的两边不能有空格,否则报错;

(2)如果变量的值没有空格、Tab缩进等空白符,可以不使用引号;但如果有空白符,就必须要用引号围起来;

(3)使用单引号和双引号的区别:

        使用单引号时,单引号包围起来的内容是什么,那么变量的值就是什么;

        使用双引号时,可以解析双引号包围起来的内容中的变量和命令;

        例如,创建一个test.sh脚本,写入下面的代码:

#! /bin/bash

#声明一个变量name,值为张三
name=张三

#声明了两个变量person1和person2,${name}表示使用变量name的值
person1='我的名字是${name}'
person2="我的名字是${name}"

#输出person1和person2的值
echo ${person1}
echo ${person2}

        输出结果:

我的名字是${name}
我的名字是张三

        可见,赋予变量person1的值中虽然使用了name的值,但是因为是使用单引号包围起来的,所以${name}这个语法并不被解析,所以person1的值为:我的名字是${name};而赋予变量person2值中也使用了name的值,但是因为是使用双引号包围起来的,所以可以解析${name},所以person2的值为:我的名字是张三。( ${变量名}表示使用某个变量的值,下面会详细介绍 )

        建议在无特殊需求的情况下,变量的值都是用双引号包围。     

4. 示例

#! /bin/bash

#定义一个值为5的变量a
a=5

#定义一个值为3.14159的变量b
b=3.14159

#定义一个值为张三的变量name1
name1=张三

#定义一个值为"   李四"的变量name2
name2="   李四"

二. 使用变量   

1. 使用变量的语法格式

(1)$变量名

(2) ${变量名} 

 2. 说明

1)这两种方式在使用中没有什么区别,只是加了花括号{}可以帮助解释器明确变量的边界。

        例如:

#! /bin/bash

#声明一个变量name,值为c
name="she"
#声明一个变量language
language="$namell是一门语言"
#输出language
echo ${language}

        执行结果:

是一门语言

        从执行结果可以看出,执行的结果并不是预期的【shell是一门语言】,这是因为在代码中$name后面还紧跟了两个字母ll,这时解释器就会认为你要使用的变量是namell,而不是name,而代码中又并未定义变量namell,所以执行的结果为【是一门语言】。如果使用${name}的话,就可以避免这种情况发生,可以明确地告诉解释器你使用的是哪个变量。

        所以,一般情况下,建议通过${变量名} 来使用变量。

3. 示例    

创建test.sh脚本,写入下面的代码: 

#! /bin/bash

#示例一:
#声明一个值为二哈的变量dog
dog="二哈"
#输出变量dog的值
echo $dog

#示例二:
#声明一个值为csdn的变量name
name="csdn"
#声明一个变量url,并使用变量name的值对url赋值
url="${name}的网址为www.csdn.net"
#输出url的值
echo $url

输出结果:

二哈
csdn的网址为www.csdn.net

三.  改变变量的值

1. 改变变量的值规则

        如果想要给一个变量重新赋值,只需要把新的值赋给变量即可。

2. 示例

 创建一个test.sh脚本,并写入下面的代码:

#! /bin/bash

#声明一个变量name,值为张三
name="张三"
#输出name
echo "第一次输出name变量的值:${name}"
#给变量name赋予新值为李四
name="李四"
#输出name
echo "第二次输出name变量的值:${name}"

输出结果:

第一次输出name变量的值:张三
第二次输出name变量的值:李四

四. 只读变量

1. 定义只读变量的规则

       定义只读变量,只需要在定义变量时在前面加上 readonly 命令即可。只读变量的值不能被改变。

2. 示例

创建一个test.sh脚本,写入下面的代码: 

#! /bin/bash

#定义一个只读变量name
readonly name="张三"
#输出name
echo ${name}
#重新把李四这个值赋予name
name="李四"
#再次输出name
echo ${name}

输出结果:

张三
./Hello.sh:行8: name: 只读变量
张三

        可见,报错提示name为只读变量,值不可改变,而name的值也并没有变为李四。

五. 删除变量

1. 删除变量的语法格式

        使用 unset 命令可以删除变量:【unset 变量名】

2. 说明

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

3. 示例

#! /bin/bash

#声明一个变量a,值为5
a=5
#然后删除这个变量
unset a
#输出a
echo "变量a的值为${a}"

       输出结果:

变量a的值为

        可见,变量a被删除后,不能再被使用,所以输出结果为【变量a的值为】。

六. 将命令的执行结果赋给变量

        在Shell编程中,是支持将命令的执行结果赋值给变量的,这也被称为命令替换。

1. 命令替换的语法格式

(1)变量名=`执行的命令`
(2)变量名=$(执行的命令)

2. 说明

(1) 第一种方式是用反引号(位于 Esc 键的下方)把命令包围起来,因为反引号和单引号相似,容易产生混淆,所以不推荐使用这种方式;

(2) 第二种方式使用$()把命令包围起来。

(3)如果需要将多个命令的执行结果赋值给变量,多个变量用英文分号 ; 隔开即可。

3. 示例

(1) 定义一个变量a,并把命令【ls /home】的执行结果赋值给变量a,【ls /home】表示输出home目录下的目录列表;

(2)然后使用echo命令输出变量a的值;

              

        可见,使用a=$(ls /home),已经将命令【ls /home】命令的执行结果赋给了变量a。      

 另外,如果不明白为什么可以直接在终端命令行输入Shell编程代码,可以阅读这篇文章:

Linux的Shell编程https://blog.csdn.net/weixin_55118477/article/details/121361619?spm=1001.2014.3001.5501

七. 特殊变量

1. Shell中的特殊变量

        在Shell中,还定义了一些被赋予特殊作用的特殊变量,如下:

$0获取执行脚本命令中的脚本文件路径。
$n(n≥1)获取指定位置的位置参数(即传递给脚本或函数的参数)。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。
$#获取传递的位置参数的个数(即传递给脚本或函数的参数个数)。
$*获取传递的所有的位置参数(传递给脚本或函数的所有参数)。
$@获取传递的所有的位置参数(即传递给脚本或函数的所有参数)。当被双引号" "包含时,$@ 与 $* 稍有不同。
$?获取上个命令的退出状态,或函数的返回值。
$$获取当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。

 2. 各个特殊变量的说明

(1)$0:严格来讲,$0获取的是执行脚本的命令中的指定的脚本文件路径,而不是单纯地获取脚本文件的名称,可以通过下面的例子来说明:

在根目录下创建一个test.sh脚本,写入下面的代码:

#! /bin/bah

#输出执行当前脚本的命令的文件名。
echo $0

如果使用【/bin/bash  test.sh】执行脚本,则运行结果为:

如果使用【/bin/bash  ./test.sh】执行脚本,则运行结果为:

 如果使用【./test.sh】执行脚本,则运行结果为:

如果把根目录下的test.sh脚本移动到home目录下,使用【/bin/bash  /home/test.sh】执行脚本,则运行结果为:

        通过上面的几个例子可见,在执行脚本文件的命令中,使用不同的指定路径,$0并不是都输出一个结果,即脚本文件的名称,而是输出每个命令中指定的脚本文件路径,所以,$0获取的是执行脚本的命令中的指定的脚本文件路径。

(2)$n、$#、$*、$@都是用来获取位置参数的特殊变量。在shell中,位置参数分为两种,一种是传递给脚本的参数,一种是传递给函数的参数。但只要是位置参数,这几个特殊变量的用法是一样的:$n是获取指定位置的位置参数;$#用来获取位置参数的个数;$*和$@都是用来获取所有的位置参数。这里以获取传递给脚本的参数为例,来介绍这几个特殊变量的使用:

在根目录下创建一个test.sh脚本文件,写入下面的代码:

#! /bin/bash

#获取传递给脚本的第一个参数
echo "传递给脚本的第一个参数:$1"

#获取传递给脚本的第二个参数
echo "传递给脚本的第一个参数:$2"

#获取传递给脚本的第三个参数
echo "传递给脚本的第一个参数:$3"

#获取传递给脚本的参数的个数
echo "传递给脚本的参数的个数:$#"

#获取传递给脚本的所有参数
echo '使用$*来获取传递给脚本的所有参数:' $*
echo '使用$@来获取传递给脚本的所有参数:' $@

运行脚本时给脚本传递参数:【/bin/bash  test.sh   张三  李四  王五】,输入结果如下:

传递给脚本的第一个参数:张三
传递给脚本的第一个参数:李四
传递给脚本的第一个参数:王五
传递给脚本的参数的个数:3
使用$*来获取传递给脚本的所有参数: 张三 李四 王五
使用$@来获取传递给脚本的所有参数: 张三 李四 王五

 说明:

        用这几个特殊变量获取传递给函数的参数的用法,和上面的一样,不再赘述。如果你对位置参数不够了解,或者想要更详细的了解这几个特殊变量的使用,可以阅读这篇文章:

(3)$?:用来获取上个命令的退出状态,或函数的返回值。所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。

1) 查看上个命令的退出状态:

例如,查看ls命令的退出状态,先执行ls命令,然后执行echo $?:

 可见,ls命令执行成功,通过echo $?查看它的退出状态为0。

2) 获取函数的返回值:

创建一个test.sh脚本文件,定义一个返回值为10的函数:

#! /bin/bash

#定义一个返回值为10的函数a
function a(){
    return 10
}

#调用函数
a
#获取函数的返回值
echo $?

运行结果:

10

 (4)$$:获取当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值