计算机语言是相通的,但是却各有特点。很多时候我们了解了一门语言后大呼“哦,原来是这么回事儿”,事后又忘记了。当再次遇到问题,或者搁置一段时间后想要再次上手仍然显得困难。因此,我打算对每种语言(shell,python,javascript,php)总结一些基本的概念和知识。主要是从基本概念和特点、变量、基本类型及作用域、函数定义、判断及循环着手吧。
shell脚本中一切皆是命令,是一堆命令的集合。 shell脚本很有意思,和一般的编程语言很不一样,每句话都是可以在命令行中运行的,是一系列命令的组合。一些有意思的例子
a=1
和 a = 1
怎么被解析,因为命令和选项由空格隔开,前面一句没有空格,命令是"a=1",解析到了=号,所以认为是赋值命令,参数由等号前后决定。后面的a = 1
被解析为命令是a
,参数是等号和1,而a是没有被定义的,所以发生了错误。从这里我们可以充分理解一切都是命令了吧。 再来看if中的条件判断,其实[
也是一条命令,相当于test,只不过[
的最后一个参数必须是]
来表示结束,命令的写法就是命令+空格+参数+空格
,所以命令[
的写法就是[+空格+若干参数+]
,所以如果[
和参数之间没有空格,就会认为命令是]+参数
,显然没有这样的命令,所以又会出错$varname表示变量,是${varname} 的一个缩写。赋值使用varname=$val
shell中变量类型概念很弱,普通的都当做字符串来处理。用 $(())可以表示整数操作, let也可以进行计算, 例如 a=$((b+1))
, echo $((b++))
, echo $((--b))
。shell中也有数组,可以用小括号加空格来赋值,引用数组变量要用 ${var[index]}
,index为/@的时候表示所有元素, 个数用 ${#var[*]}
,可以用 for var in ${arr[]}或者while进行遍历,清空单个用空赋值,unset清空所有。
变量的作用域为shell进程,函数的意义决定了没有函数作用域,用export可以扩大变量作用域
再次强调,函数其实是命令的集合,也是一个命令,所以调用方式是 functname param1 param2 ...
而不是 functname(param1, param2, ...)
函数定义:
function functname {
shell commands
}
或者
functname() {
}
我们可以在脚本中来获取参数的值。使用$N,其中$0是函数名称,$1为param1,$2为param2,如此类推,如果N大于实际参数的数目,为空。我们一般将位置变量是从$1开始。 $* 表示所有参数组成的一个字符串,这些参数之间的间隔是IFS的首个字母即空格,IFS包括TAB,空格,换行等字符。 $@ 等同于"$1" "$2"... "$N"。 $# 表示参数的个数 $? 退出码
有了以上的基础,一些基本的脚本程序就可以搞定了。其他的遇到问题再查资料吧。