shell 变量

shell作为一门脚本语言,支持变量的定义和使用。变量的定义和使用也很简单,定义一个变量NUM后,使用$NUM就可以使用这个变量:

#!/bin/bash
NUM=100
echo $NUM

运行这个脚本:

root@pc:/home/demo# ./hello.sh 
100

shell脚本语言不像C语言那样宽松,对格式的要求检查很严格。像NUM=100这样的赋值语句,等号两边是不能有空格的,否则脚本运行就会报错。

shell变量名的命名规则和其他编程语言的命名规则一样:

  • 变量名可以由数字、字母和下划线组成
  • 变量名不能以数字开头,必须以字母或者下划线开头
  • 不能跟shell中保留的关键字重名,产生冲突

shell变量的值中如果有一些特殊的符号,需要使用单引号括起来:比如变量值中有空格、缩进、换行等,就需要使用单引号把它们包起来,否则shell在解析某一行命令时,遇到空格,就会进行切割,认为空格两边的字符串是两个不同的命令或参数。

root@pc:/home/demo# cat hello.sh 
#!/bin/bash
string=hello zhaixue.cc
echo $string
string='hello zhaixue.cc'
echo $string

root@pc:/home/demo# ./hello.sh 
./hello.sh: line 3: zhaixue.cc: command not found

hello zhaixue.cc

在上面的脚本中,shell在解析 string=hello zhaixue.cc 这条语句时,以空格为界,会将其拆分为string=hello和zhaixue.cc 两个命令,前半句没有问题,是个赋值语句,而后半句的zhaixue.cc,shell会将其认为是一个命令,导致脚本运行出错。

shell变量的值中嵌套变量,或者说引用其他变量的值时,此时这个变量一般要用双引号括起来。使用双引号包起来的变量的值,在程序中引用时会首先解析里面嵌套变量的值,而不是纯粹的原字符输出。

root@pc:/home/demo# cat hello.sh 
#!/bin/bash
URL=www.zhaixue.cc
echo '宅学部落:$URL'
echo "宅学部落:$URL"

root@pc:/home/demo# ./hello.sh 
宅学部落:$URL
宅学部落:www.zhaixue.cc

对比上面脚本的运行结果可以看到:使用单引号包起来的字符串,字符串是啥,就输出啥,原样输出,单引号中的变量引用是无效的。而使用双引号包起来的字符串,在输出之前,会解析字符串中使用$引用的变量,替换后,再输出。使用双引号的优势是:在双引号里可以引用变量、甚至还可以出现转义字符。

调用shell命令

变量一般使用 $val 或 ${val} 的形式进行引用,用来获取这个变量的值,其中的一对大括号可以省略。但我们在shell脚本中经常看到下面的引用形式:

root@pc:/home/demo# cat hello.sh 
#!/bin/bash
user=`whoami`
path=$(pwd)
echo $user
echo $path

root@pc:/home/demo# ./hello.sh 
root
/home/demo

shell变量的赋值语句中,使用反引号``或$()包起来的部分,不是真正要赋值给变量的内容,而是一个可以执行的shell命令,而是把这个命令的运行结果赋值给变量。

使用反引号或$()包起来的shell命令可以灵活灵活多变的,可以支持多个参数,甚至还可以使用管道复杂命令:

root@pc:/home/demo# cat hello.sh 
#!/bin/bash
lines=$(cat hello.sh | wc -l)
echo $lines

root@pc:/home/demo# ./hello.sh 
3

这里需要注意的是:反引号和单引号不是一回事,反引号位于键盘tab键的上方,在英文输入模式下,敲击这个反引号键,即可输入一对反引号。

只读变量

使用readonly可以将变量定义为只读变量,只读变量只能赋值一次,赋值后就不能再改变。

root@pc:/home/demo# cat hello.sh 
#!/bin/bash
URL=www.zhaixue.cc
echo $URL
readonly URL
URL=www.wanglitao.cc

root@pc:/home/demo# ./hello.sh 
www.zhaixue.cc
./hello.sh: line 5: URL: readonly variable

删除变量

使用set命令,可以查看当前定义的变量,使用unset命令,可以删除一个定义的变量。一个变量被删除后,它的值也就变为了空,再次打印这个变量值,不会有任何输出。

root@pc:/home/demo# cat hello.sh 
#!/bin/bash
URL=www.zhaixue.cc
echo $URL
unset URL
echo $URL

root@pc:/home/demo# ./hello.sh 
www.zhaixue.cc

root@pc:/home/demo#
《Linux三剑客》视频教程:Linux下开发工具vim、Git、Makefile、autotools、qemu、debug精讲,从零开始一步一步写项目的Makefile,提供企业级Makefile模板,Git操作实战,vim从新手到高手,一步一步打造类似Source Insight的IDE!详情点击:王利涛老师个人淘宝店:Linux三剑客