Bash 变量

王 茂南 2022年2月19日07:50:06
评论
3462字阅读11分32秒
摘要本文会介绍 Shell 中的变量。主要有三个大点,分别是,Shell 变量简介(变量的定义和删除),Shell 变量的赋值和引用 Shell 变量。

简介

在上一篇中,我们介绍了 Shell 和 Bash 的相关内容,Bash 入门。在本文中,我们会更进一步,来介绍 Shell 中的变量。主要分为下面几个知识点来介绍:

  • Shell 变量简介
    • Shell 变量的特性
    • Shell 变量的定义
    • Shell 变量的删除
  • Shell 变量的赋值
    • 直接赋值
    • 命令结果进行赋值
    • read 接受用户输入
  • 引用 Shell 变量
    • 引用变量使用双引号
    • 扩展变量
    • 特殊变量

 

Shell 变量简介

Shell 变量的特征

Shell 变量主要有下面两个特点:

  • 没有众多的存储类及类型限制,都是字符串
  • 不需要预先定义,可以直接赋值;

 

Shell 变量的定义

Shell 变量定义的格式如下所示:

  1. 变量名=字符串

其中变量名可以由字母,数字,下划线组成。但是:

  • 只能由字母或下划线开头(不能是数字开头)。
  • 建议不要使用命令关键字,如定义的变量名不可以为 echo 或 rm 等命令。(可用 help 命令查看保留关键字)

例如下面有两个正确的Shell 变量的定义和一个错误的定义(错误的原因是使用了数字开头):

  1. # 正确的定义
  2. user2=mathpretty1
  3. _user3=mathpretty2
  4. # 错误的定义
  5. 4user=mathpretty3

 

删除变量

对于定义的变量我们可以使用 unset 命令进行删除操作,两个常用的选项如下:

  • -f 仅删除函数
  • -v 仅删除变量

如下示例,我们定义变量,然后将其删除:

  1. # 定义
  2. user1=mathpretty001
  3. user2=mathpretty002
  4. # 查看值
  5. echo $user1 $user2
  6. # 删除
  7. unset user1 user2
  8. # 删除后再次查看
  9. echo $user1 $user2

最终的结果如下所示,删除后在打印则为空:

Bash 变量

 

Shell 变量的赋值

直接赋值

在 shell 中,变量是无类型的,即所有变量的值都是一串字符,即字符串。当然,也可以为空字符串。对于变量的赋值需要注意的是:

  • 在等号 = 的两边不能有空格(非常重要)
  • 如果在变量的值中包含空格,需要使用单引号 '' 或者双引号 ""
  • 如果赋值的是一个已存在的变量名,则会覆盖掉原有的内容

下面是关于  shell 变量赋值的正确和错误写法:

  1. # 正确的定义
  2. user1=mp1
  3. user2='mp2'
  4. user2="mp3"
  5. # 错误的定义,等号两边有空格
  6. user4 =mp4
  7. user5= mp5
  8. user6 ='mp6'

 

命令结果进行赋值

上面赋值的方式为「直接赋值」。除了使用上述的方式对变量进行赋值之外,我们还可以使用命令执行的结果进行赋值。一般有两种方式。这两种方式又被称为命令替换,即使用命令的输出来替换命令本身。

  • 反引号 `
  • $(command)

使用「反引号」的例子:使用「反引号 `」我们可以在字符串中执行命令(只能使用双引号),也可以直接引用命令执行的结果进行赋值,如下示例:

  1. # 直接使用反引号进行赋值,这里没有引号
  2. user1=`echo mathpretty`
  3. echo $user1
  4. # 也可以在字符串中执行命令
  5. user2="mathpretty `echo MM`"
  6. echo $user2

最终的结果如下所示:

Bash 变量

使用$(command)的例子:这种方法直接将命令写在括号中即可,我个人比较喜欢这种方法。下面是一个简单的例子:

  1. # 使用 $() 进行赋值
  2. _user='hello world'
  3. user1=$(echo $_user)
  4. # 查看 user1
  5. echo $user1

最终的输出结果为 hello world,如下图所示:

Bash 变量

 

read 接受用户输入

除了「直接赋值」和「命令结果赋值」这两种方式外,我们还可以使用 read读取标准输入的内容,然后将其赋值给一个变量或数组。read命令多用于接收用户输入。

read命令常用用法如下:

  1. read: 用法: read [-s 关闭回显] [-a 数组] [-n 读取字符数] [-p 提示符] [-t 超时] [名称 ...]

下面是几个关于read命令的用法例子:

  1. # 读取用户输入赋值给变量 user1,输入完成后使用回车即可
  2. read user1
  3. echo $user1
  4. # 读取用户输入赋值给多个变量,user2,user3,输入的时候需要使用空格分隔
  5. read user2 user3
  6. echo $user2 $user3
  7. # 使用命令提示符,提示输入
  8. read -p "please enter your username:" user4
  9. echo $user4
  10. # -t 指定超时时间,即等待用户输入的时间,不会一直等待用户的输入,设置的时间单位为秒
  11. read -p "username:" -t 5 user6 user7
  12. echo $user6 $user7
  13. # -s 不会显示输入的内容,
  14. read -s user8
  15. echo $user8

最终的结果如下图所示:

Bash 变量

 

引用 Shell 变量

为了引用 Shell 变量,我们在变量名前面使用美元符号 $因为在 Shell 中变量是无类型的,而为了区分到底引用的是变量的值还是字符串,需要在变量名前面使用美元符号 $

下面是一个简单的引用 Shell 变量的例子,这个其实和我们在上面的示例代码是一样的:

  1. user="123"
  2. echo $user

 

引用变量使用双引号

有一点是需要注意的。在使用变量时,如果变量存在于引号内,则必须使用双引号。下面是一些正确「引用」的写法和错误「引用」的写法。

  1. user1=mathpretty
  2. # 正确的引用,
  3. user2="hello $user1"
  4. user2="hello"$user1"hello"
  5. user2='hello'$user1'hello'
  6. # 错误的引用,在 user2 中引用,使用单引号
  7. 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 进行赋值,故最后可以打印出这两个变量的值:

  1. # 定义
  2. user1=mathpretty001
  3. # 打印 $user1 并设置 $user2 的值
  4. echo $user1 ${user2:=mathpretty002}
  5. # 此时,能够打印出 $user1 $user2
  6. echo $user1 $user2

 

特殊变量

在 bash 中,还有两种特殊的变量,分别为「位置参数」和「状态变量」。

位置参数:位置参数 $n 代表的是 bash 脚本执行时的命令行参数,也代表 bash 脚本中定义的函数参数。$n 表示传递给脚本或函数的参数。n 是一个非负的整数,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。在 n 大于等于 10 的时候,需要使用 ${n}

例如我们在脚本中写入以下的内容:

  1. echo ${1} ${2} ${3}

接着运行的时候带有三个参数,最终这三个参数会被打印,如下所示:

Bash 变量

状态参数:还有一些特殊的状态参数,这些变量仅仅可以被引用,而不可以被修改,说明如下:

  • $0 当前脚本的文件名
  • $# 传递给脚本或函数的参数数量
  • $* 传递给脚本或函数的所有参数
  • $? 获取执行上一个指令的执行状态返回值(0 为成功,非零为失败)
  • $$ 获取当前执行的 shell 脚本的进程号(PID
  • $! 获取上一个在后台工作的进程的进程号
  • $_ 获取在此之前执行的命令或脚本的最后一个参数

我们看一个简单的使用例子:

  1. # 打印文件名
  2. echo $0
  3. # 打印所有的参数个数
  4. echo $#
  5. # 打印所有的位置参数
  6. echo ${*:-"no parameter"}
  7. # 打印当前执行的进程号
  8. echo $$

最终的结果如下所示,分别打印出「文件名」,「参数个数」,「参数内容」,「进程号」。

Bash 变量

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2022年2月19日07:50:06
  • 转载请务必保留本文链接:https://mathpretty.com/14578.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: