您的位置:首页 > 运维架构 > Shell

我为何选择tcl而不是bash来编写日常的自动化脚本

2016-03-25 15:09 393 查看
为了编写一些自动化的脚本我学习bash好几回,可惜在需要用到的时候,发现已经忘得差不多了。就一个简单的if else语句,也会因为空格或缩进导致错误,还有复杂的语法规则,替换规则,令人望而却步。

##TCl的规则

一切都是字符串

一切都是命令 (单独一行,或者[]内嵌命令)

tcl的规则只有这样两条!简直不可思议,但它真的会工作。每次写tcl脚本的时候,只要在脑子里面过一下这两条规则基本上就不会错了。

一切都是字符串

先介绍一个命令puts,相当于println.

puts a"b
puts 'abc

字符串不是以引号什么来区分(因为一切都是字符串),双引号的作用是将多个词组织起来,使得在某些场景下看起来是一个单位。

puts a b
#puts看到2个参数的话,会把第一个当作文件句柄,此段代码会出错
puts "a b"
#这样对puts来说就是一个参数

列表什么的也是字符串,在需要看到list的时候,字符串就是list。挺玄妙的吧:)

string length "a b"
#string主命令,length次命令,"a b"是参数,注意这个参数值不包括",它只是起到一个组合的作用。命令的结果是3。

llength "a b"
#llength是获取列表长度的命令,它希望看到的是list,那么参数就是list。结果是2

llindex "a b" 0
#结果是a

没有关键字,都是命令

if 1 {
puts hello
}

if仅仅是一个命令,和puts一样,没有特殊性。{}不是代码块的分隔符!,在tcl里面{}和""的作用相似,起到组合作用,只是""里面的变量会替换,{}不作替换。

数字也是字符串,只是需要看到数字的时候就是数字而已。

expr 1 + "2"
#注意双引号不属于值,所以2 == "2" == {2}

以上列举的内容,从其它语言使用者角度来看是比较奇特的。有空仔细琢磨tcl的这两个规则,一旦贯通,编写tcl脚本就很顺手了。

以下网址是我最近用tcl脚本编写的一些用在vagrant provision的脚本,用来简化开发环境的部署。
https://github.com/jianglibo/cld
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: