前言:文章中所阐述的关于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。