前言
本篇文章会着重讨论关于Shell变量的一些细节要点,例如Shell变量的类型是什么,定义Shell变量的几种方式以及它们的区别等,加深大家对Shell变量的理解,以及在各个场景下如何灵活运用变量。
Let’s get started.
Shell 变量专题
1. Shell变量的类型是什么
在Shell中,给变量赋予的值都被视为字符串类型。
2. 如何定义Shell变量
定义Shell变量的三种方式:
name=Tom
name='Tom'
name="Tom"
注意:"=" 两边不能有空格。对于第一种方式,赋予的值不能含有空格,如果包含空格,必须用引号。例如:
#以下定义是错误的:
name=Tom W
那么单引号和双引号有什么区别呢?
对于普通的字符串,用单引号和双引号效果是一样的,但如果赋予的值中包含了变量,希望最终能将变量的值包含在当前的赋予值中,则必须用双引号。举个例子:
name=Tony
hello="Hello, ${name}"
echo ${hello}
如果希望获得${name}的值Tony, 则必须用双引号:
Hello, Tony
如果用单引号,就会变成以下结果:
Hello,${name}
3. 聊聊Shell中的全局变量,局部变量,环境变量
全局变量:在当前Shell进程中可以被使用的变量。
局部变量:仅能在函数内部使用的变量。
环境变量:在当前Shell进程以及Shell子进程中都能使用的变量。
说明:
1 关于全局变量,Shell 中默认定义的变量都是全局变量,即使变量定义在函数中,也是全局变量。
2 局部变量必须用关键字local进行声明。
例子:
function A() {
#这里的a依旧可以在函数外部被调用。
a=1
#这里的b才是正真的局部变量。
local b=1
}
这里申明了一个函数,函数内部定义了两个变量a,b。其中,a是全局变量,b是局部变量。
3 环境变量要通过export关键字进行声明,这样在子Shell进程中也可以引用。但要注意,这种环境变量是传子不传父的。如果在Shell子进程定义一个变量并通过export 声明为环境变量,那么该进程的父进程是无法获得这个变量的。
4 怎么创建只读变量
格式:
readonly variableName
例子:
name=Tony
readonly name
name=Alice
test1.sh: line 3: name: readonly variable
5 命令结果如何赋值给变量
两种方式(直接通过代码说明):
#方法1
a=`cat test.txt`
#方法2
b=$(cat test.txt)
两种方式都可以获取命令结果并赋值给变量。它们的区别在于:
方法1是无法做嵌套的,但方法2是可以的。
举个例子:
正确:
path=$(cd $(dirname $0);pwd)
echo ${path}
错误:
path=`cd `dirname $0`;pwd`
echo ${path}
希望对大家有所帮助。
Tony