在其位,谋其职。之前从来没有认真的学习过shell script,以至于每次有任务都要重新翻查手册,深感麻烦,不如此次彻底认真的学习一下,也省去了之后的很多麻烦。就以这篇文章开始吧。
本系列是主要参照《shell 脚本学习指南》这本书,感觉这本书写的很不错,推荐一下。
一.变量
1.变量的赋值
学习一门新的编程语言首先要搞清楚变量这个东东,在shell中,变量都是以字符串的形式来赋值的,除非有特殊的说明,并且 = 号两侧不能有空格,否则shell将会把你的变量名识别成command。例如
var=hello
echo $var
输出:hello
但是如果你写成了
var = hello
echo $var
则会输出 var: command not found.
上述是直接 = 赋值,这种方式会将var原来的值覆盖掉, 还有一种是 += 赋值, 这种方式将会将后来的值连接在先前的值后面。例如:
var=hello
var+=world
echo $var
输出: helloworld
既然是字符串那么完全可以将好几个单词赋值给一个变量了,当然,多个单词的意思是单词之间有空格,那么这是必须将字符串使用引号 “” 括起来,不然又会被识别成命令啦。
var=“hello world”
2.四则运算
上一节我们知道了字符串的赋值方式,很简单,没有空格就直接 = 赋值即可,有空格就用“” 引起来, 那么shell可不可以像整形数据一样做四则运算呢,当然可以,但是需要使用双括号 (())括起来才行。例如
var=1
((var=var+1))
var=$((var+2))
上面两种方式都是可以的。
3. Others
变量可以被设置成为只读的,这对于要使用常量的场景非常合适, 方式:readonly var
关于变量就先说这么多,随着以后的学习我会继续补充。
二. 运算符
1.替换运算符,这一类运算符用以探测一个变量的值是否存在等等情况,常用的有此类运算符有
1) ${varname:-word} :注意{ }, 如果varname的值非null,则返回varname的值,否则就返回word, 但是并没有将word的值赋值给varname
2) ${varnmae:=word} :注意{ }, 如果varname的值非null,则返回varnmae的值,否则将word的值赋给varname,然后返回其值,varname依然有值啦
3) ${varnmae:?message}:注意{ }, 如果varname的值非null,则返回varname的值,否则显示varname:message并退出当前的脚本
4) ${varname:+word}:与1)对应,如果varname的值非null,则返回word的值,否则就返回varnamae的值
2. 模式匹配运算符
此类运算符将会删除匹配成功的字符串, #,##用于删除开头处匹配成功的字符串; %,%%用于删除结尾处匹配成功的字符串
${variable#pattern} , 从开头处开始,删除最短的匹配
${variable##pattern}, 从开头处开始,删除最长的匹配
${variable%pattern}, 从结尾处开始,删除最短的匹配
${variable%%pattern},从结尾处开始,删除最长的匹配
3. 计算字符串的长度
${#characters}
三. 特殊变量
在shell script的阅读中会经常遇到各类奇奇怪怪的符号$# $@等,让人看了很晕,这一节我们就剖析一下这些奇形怪状到底是什么东东。
1.参数相关
首先需要明确的是这些符号是对传递给脚本或者函数的参数有效的,这些符号的学习主要是方便对于位置参数的处理。
1). $#: 表示传递的参数的总数,这个总数是可以改变的,这就用到了shift这个命令,shift命令用于移开第一个参数,移开之后参数的个数当然就减一了。
2). $*,$@: 这两个符号的作用相同,可以表示传递来的所有参数,实际使用时是这样子的:
for var in $*
do
echo $var
done
3). "$*":将所有的参数当做一个整体字符串,即 “$1 $2 $3”
4). "$@" : 将每一个参数当做一个独立的字符串,即“$1” "$2"
2.内置的特殊变量
有点多,懒得打字啦,直接截图上传
PS:
关于参数列表,除了使用 $*外,还可以使用看起来非常专业的getopts。getopts的模式: getopts f:val opt, 第一个选项是传入的参数选项,其中的冒号表示还有参数该选项后面还有参数,并且该参数被放置到OPTARG中,而选项则会放在getopts的第二个选项中;另外还有OPTIND,用来放置下一个要处理的参数的索引。值得注意的是,getopts会自动的将选项前面的 - 去掉,所以强烈建议使用这种方式来处理参数。