二.shell脚本的变量。
到目前为止,已经将shell当成了一门脚本语言在讲述。同样这也避不开的是shell的各种变量了。这节主要学习一下shell的变量。
shell变量不像c语言那样要事先声明和定义。shell变量需要时直接使用即可,看一个例子。
在first.sh里面。最后一行加入如下的内容:
first=bye
echo “$fist”
运行脚本,输出如下:
hello world!
bye。
注意:这里的echo 使用了双引号,而前面的echo使用了单引号。
双引号表示:不是直接输出,而是进行展开,将$first展开之后就是bye。单引号表示:直接按原样输出,如果改成echo ‘$first’那么执行结果将会是:
hello world!
$first
这个例子里面有对于shell变量的赋值和引用。
2.1变量命名,赋值和引用
2.1.1shell变量的命名遵循如下规则
首个字符必须为字母(a-z,A-Z)。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
2.1.2给shell变量赋值时使用等于号。如下:
first=bye
注意:等于号两边不能有空格。
如果变量的值需要空格,可以使用引号将其包围如下:
first=”bye bye”或者first=’bye bye’.
单双引号的区别就是:要不要对引号包围的内容进行扩展。单引号是直接将字面值赋值给变量;双引号要进行扩展。此处并不能显示出来。如果是使用下面的例子就非常明显了:
who=world
bye=”bye $who”
bye的值就是bye world。如果bye=’bye $who’那么bye的值就是bye $who
2.1.3 引用变量的值使用美元符号$
first=’hello world’
echo $first
输出如下:
hello world
在脚本中你还会看到如下形式的变量引用
echo $(某个名字)
echo `某个名字` (注意:这不是单引号,这是键盘上数字键1左边那个键。)
echo ${某个名字}
其中echo $(某个名字) 和echo `某个名字`表示:先运行“某个名字”所代表的命令,然后将该命令的结果赋值给一个匿名的变量,再将这个匿名变量打印出来。
这两个命令效果一模一样。` `是早期shell程序员使用的一种方法,后来因为这个符号不容易和单引号区分开,导致编写和阅读有很大的障碍。后来慢慢就改成了小括号。
echo ${某个名字}:这个其实是变量的替换和查找。“某个名字其实是一个表达式”。具体解释如下:
var=${first-“wanbiao”} 表示:如果first没有设置,就将“wanbiao”赋值给var。否则就将first的值赋值给var。
var=${first+”wanbiao”}与上面刚好相反,表示:如果first被设置了(不管是否为空字符串),就将”wanbiao”赋值给var,否则var为空。
var=${first:-“wanbiao”} 表示:first没有被设置,或者为空,就将“wanbiao”赋值给var,否则将first的值赋值给var。
var=${first:+”wanbiao”}表示:如果first被设置了,且为非空,就将“wanbiao”赋值给var,否则var被赋值为空。
var=${first=”wanbiao”}表示:first没有设置时,将“wanbiao”赋值给first和var。否则将first的值赋值给var
var=${first:=”wanbiao”}表示:first没有设置,或为空时,将“wanbiao”赋值给first和var。否则将first的值赋值给var
var=${first?”wanbiao”}表示:first没有设置,将报错,否则,将first的值赋值给var
var=${first:?”wanbiao”}表示:first没有设置,或者为空,报错,否则将first的值赋值给var
除了上面对变量赋值的操纵以外,还有下面对变量的删除和替换。
${变量#”wanbiao”} 表示:从左开始,删除最短的,满足“wanbiao”的字符串。
${变量##”wanbiao”} 表示:从左开始,删除最长的,满足“wanbiao”的字符串
${变量%”wanbiao”} 表示:从右开始,删除最短的,满足“wanbiao”的字符串
${变量%%”wanbiao”} 表示:从右开始,删除最长的,满足“wanbiao”的字符串
${变量/旧字符串/新字符串} 表示:从左边开始,将第一个满足旧字符串的位置,替换成新的字符串。
${变量//旧字符串/新字符串} 表示:将满足旧字符串的所有位置,都替换成新字符串。
2.1.4取消变量设置
当我们设置了一个变量之后,怎么把他变成跟没有设置一样呢?使用命令unset命令。
unset bye
将bye设置成没有使用声明之前的状态
2.2Shell的特殊变量:
$0 $1 $2 $3… 脚本程序的参数。$0表示脚本程序本身,$1,表示第一个参数,$2表示第二个参数,一次类推。
$* 表示所有的参数
$@ 也表示所有的参数。
$*和$@的区别是:$@表示的所有参数,以空格分开。而$*表示的所有参数,以IFS变量的值作为分隔符。如果IFS的值为空,那么$*表示的所有参数将挤在一起。
$# 表示参数个数
$$ 表示进程号
$? 表示上一个命令运行完成之后的执行情况,0表示正常退出,非零表示非正常退出
因为使用了markdown编辑器,这里又涉及到一些特殊字符,因此,可能会有一些错误,希望看到的读者能帮忙指正,谢谢!