文章目录(Table of Contents)
简介
在上一篇中,我们介绍了 Shell
和 Bash
的相关内容,Bash 入门。在本文中,我们会更进一步,来介绍 Shell
中的变量。主要分为下面几个知识点来介绍:
Shell
变量简介Shell
变量的特性Shell
变量的定义Shell
变量的删除
Shell
变量的赋值- 直接赋值
- 命令结果进行赋值
- read 接受用户输入
- 引用
Shell
变量- 引用变量使用双引号
- 扩展变量
- 特殊变量
Shell 变量简介
Shell 变量的特征
Shell
变量主要有下面两个特点:
- 没有众多的存储类及类型限制,都是字符串;
- 不需要预先定义,可以直接赋值;
Shell 变量的定义
Shell
变量定义的格式如下所示:
- 变量名=字符串
其中变量名可以由字母,数字,下划线组成。但是:
- 只能由字母或下划线开头(不能是数字开头)。
- 建议不要使用命令关键字,如定义的变量名不可以为
echo
或rm
等命令。(可用help
命令查看保留关键字)
例如下面有两个正确的Shell
变量的定义和一个错误的定义(错误的原因是使用了数字开头):
- # 正确的定义
- user2=mathpretty1
- _user3=mathpretty2
- # 错误的定义
- 4user=mathpretty3
删除变量
对于定义的变量我们可以使用 unset
命令进行删除操作,两个常用的选项如下:
-f
仅删除函数-v
仅删除变量
如下示例,我们定义变量,然后将其删除:
- # 定义
- user1=mathpretty001
- user2=mathpretty002
- # 查看值
- echo $user1 $user2
- # 删除
- unset user1 user2
- # 删除后再次查看
- echo $user1 $user2
最终的结果如下所示,删除后在打印则为空:
Shell 变量的赋值
直接赋值
在 shell
中,变量是无类型的,即所有变量的值都是一串字符,即字符串。当然,也可以为空字符串。对于变量的赋值需要注意的是:
- 在等号
=
的两边不能有空格(非常重要) - 如果在变量的值中包含空格,需要使用单引号
''
或者双引号""
- 如果赋值的是一个已存在的变量名,则会覆盖掉原有的内容
下面是关于 shell
变量赋值的正确和错误写法:
- # 正确的定义
- user1=mp1
- user2='mp2'
- user2="mp3"
- # 错误的定义,等号两边有空格
- user4 =mp4
- user5= mp5
- user6 ='mp6'
命令结果进行赋值
上面赋值的方式为「直接赋值」。除了使用上述的方式对变量进行赋值之外,我们还可以使用命令执行的结果进行赋值。一般有两种方式。这两种方式又被称为命令替换,即使用命令的输出来替换命令本身。:
- 反引号
`
$(command)
使用「反引号」的例子:使用「反引号 `
」我们可以在字符串中执行命令(只能使用双引号),也可以直接引用命令执行的结果进行赋值,如下示例:
- # 直接使用反引号进行赋值,这里没有引号
- user1=`echo mathpretty`
- echo $user1
- # 也可以在字符串中执行命令
- user2="mathpretty `echo MM`"
- echo $user2
最终的结果如下所示:
使用$(command)
的例子:这种方法直接将命令写在括号中即可,我个人比较喜欢这种方法。下面是一个简单的例子:
- # 使用 $() 进行赋值
- _user='hello world'
- user1=$(echo $_user)
- # 查看 user1
- echo $user1
最终的输出结果为 hello world
,如下图所示:
read 接受用户输入
除了「直接赋值」和「命令结果赋值」这两种方式外,我们还可以使用 read
读取标准输入的内容,然后将其赋值给一个变量或数组。read
命令多用于接收用户输入。
read
命令常用用法如下:
- read: 用法: read [-s 关闭回显] [-a 数组] [-n 读取字符数] [-p 提示符] [-t 超时] [名称 ...]
下面是几个关于read
命令的用法例子:
- # 读取用户输入赋值给变量 user1,输入完成后使用回车即可
- read user1
- echo $user1
- # 读取用户输入赋值给多个变量,user2,user3,输入的时候需要使用空格分隔
- read user2 user3
- echo $user2 $user3
- # 使用命令提示符,提示输入
- read -p "please enter your username:" user4
- echo $user4
- # -t 指定超时时间,即等待用户输入的时间,不会一直等待用户的输入,设置的时间单位为秒
- read -p "username:" -t 5 user6 user7
- echo $user6 $user7
- # -s 不会显示输入的内容,
- read -s user8
- echo $user8
最终的结果如下图所示:
引用 Shell 变量
为了引用 Shell
变量,我们在变量名前面使用美元符号 $
。因为在 Shell
中变量是无类型的,而为了区分到底引用的是变量的值还是字符串,需要在变量名前面使用美元符号 $
。
下面是一个简单的引用 Shell
变量的例子,这个其实和我们在上面的示例代码是一样的:
- user="123"
- echo $user
引用变量使用双引号
有一点是需要注意的。在使用变量时,如果变量存在于引号内,则必须使用双引号。下面是一些正确「引用」的写法和错误「引用」的写法。
- user1=mathpretty
- # 正确的引用,
- user2="hello $user1"
- user2="hello"$user1"hello"
- user2='hello'$user1'hello'
- # 错误的引用,在 user2 中引用,使用单引号
- user2='hello $user1'
扩展变量
引用变量除了使用 $var
格式直接引用变量之外,还可以使用 ${var}
的方式对变量进行扩展,同样使用 ${var}
及其扩展方式不适用于单引号。常见的扩展形式如下所示:
${var}
等同于$var
;${var:-word}
如果$var
的变量值为空或未赋值,则返回word
字符串,防止变量为空值或因未定义而导致异常 ;${var:=word}
如果$var
的变量值为空或未赋值,则设置这个变量值为word
,并返回其值。位置变量和特殊变量不适用。基本同上一个,但该变量又额外给$var
变量赋值了;${var:?word}
如果$var
变量值为空或未赋值,那么word
字符串将被作为标准错误输出,否则输出变量的值。用于捕捉由于变量未定义而导致的错误,并退出程序;${var:+word}
如果$var
变量值为空或未赋值,则什么都不做,否则返回word
字符串的值,也就是整个表达式的值为word
;
下面的例子中,使用${var:=word}
对变量 user2
进行赋值,故最后可以打印出这两个变量的值:
- # 定义
- user1=mathpretty001
- # 打印 $user1 并设置 $user2 的值
- echo $user1 ${user2:=mathpretty002}
- # 此时,能够打印出 $user1 $user2
- echo $user1 $user2
特殊变量
在 bash
中,还有两种特殊的变量,分别为「位置参数」和「状态变量」。
位置参数:位置参数 $n
代表的是 bash
脚本执行时的命令行参数,也代表 bash
脚本中定义的函数参数。$n
表示传递给脚本或函数的参数。n
是一个非负的整数,表示第几个参数。例如,第一个参数是 $1
,第二个参数是 $2
。在 n
大于等于 10
的时候,需要使用 ${n}
。
例如我们在脚本中写入以下的内容:
- echo ${1} ${2} ${3}
接着运行的时候带有三个参数,最终这三个参数会被打印,如下所示:
状态参数:还有一些特殊的状态参数,这些变量仅仅可以被引用,而不可以被修改,说明如下:
$0
当前脚本的文件名$#
传递给脚本或函数的参数数量$*
传递给脚本或函数的所有参数$?
获取执行上一个指令的执行状态返回值(0
为成功,非零为失败)$$
获取当前执行的shell
脚本的进程号(PID
)$!
获取上一个在后台工作的进程的进程号$_
获取在此之前执行的命令或脚本的最后一个参数
我们看一个简单的使用例子:
- # 打印文件名
- echo $0
- # 打印所有的参数个数
- echo $#
- # 打印所有的位置参数
- echo ${*:-"no parameter"}
- # 打印当前执行的进程号
- echo $$
最终的结果如下所示,分别打印出「文件名」,「参数个数」,「参数内容」,「进程号」。
- 微信公众号
- 关注微信公众号
- QQ群
- 我们的QQ群号
评论