变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据。脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,Shell 变量也遵循这个规则 在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。 当然,如果有必要,你也可以使用 Shell declare关键字显式定义变量的类型,但在一般情况下没有这个需求,Shell 开发者在编写代码时自行注意值的类型即可。
一、变量定义
Shell 支持以下三种定义变量的方式:
代码语言:javascript复制variable=value
variable='value'
variable="value"
variable 是变量名,value 是赋给变量的值。如果 value 不包含任何空白符(例如空格、Tab 缩进等),那么可以不使用引号;如果 value 包含了空白符,那么就必须使用引号包围起来。使用单引号和使用双引号也是有区别的,稍后我们会详细说明。
注意,赋值号
=
的周围不能有空格
Shell 变量的命名规范和大部分编程语言都一样:
- 变量名由数字、字母、下划线组成;
- 必须以字母或者下划线开头;
- 不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)。
已定义的变量,可以被重新赋值
二、使用变量
使用一个定义过的变量,只要在变量名前面加美元符号$
即可
author="lizhengi"
echo $author
echo ${author}
变量名外面的花括号{ }
是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
skill="Java"echo "I am good at ${skill}Script"
如果不给 skill 变量加花括号,写成echo "I am good at
推荐给所有变量加上花括号
{ }
,这是个良好的编程习惯。
- 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变
- 使用 unset 命令可以删除变量
三、单引号和双引号的区别
以单引号' '
包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景。
以双引号" "
包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。
如果变量的内容是数字,那么可以不加引号;如果真的需要原样输出就加单引号;其他没有特别要求的字符串等最好都加上双引号,定义变量时加双引号是最常见的使用场景。
四、系统变量
4.1、常用系统变量
PWD当前目录、
USER当前用户等
4.2、显示当前Shell中所有变量:set
五、特殊变量
代码语言:javascript复制$#: 命令行参数的个数
$n : 当前程序的第n个参数,n=1,2,…,9
$0: 当前程序的名称
$?: 执行上一个指令或函数的返回值
$*: 以”参数1,参数2…..”形式保存所有参数
$@: 以”参数1”,”参数2”…..”形式保存所有参数
$$ : 本程序的PID(ProcessID)
$! : 上一个命令的PID
$- : 显示shell使用的当前选项,与set命令功能相同