实现一个简单的类shell脚本解释器 编写 Shell 脚本的最佳实践

11/27 23:27:49 来源网站:辅助卡盟网

用python的朋友都知道,一个合乎标准的python脚本大体上至少是这样的:

sftp shell脚本实现_实现一个简单的类shell脚本解释器_shell 脚本解释器

#!/usr/bin/env python

def func1():
pass

def func2():
pass

if __name__=='__main__':
func1()
func2()

他用一个很巧妙的方法实现了我们习惯的main函数,使得代码可读性更强。

在shell中,我们也有类似的小技巧:

#!/usr/bin/env bash

func1(){
#do sth
}

func2(){
#do sth
}

main(){
func1
func2
}

main "$@"

我们可以采用这种写法,同样实现类似的main函数,使得脚本的结构化程度更好。

考虑作用域

shell中默认的变量作用域都是全局的,比如下面的脚本:

#!/usr/bin/env bash

var=1
func(){
var=2
}
func
echo $var

他的输出结果就是2而不是1,这样显然不符合我们的编码习惯,很容易造成一些问题。

因此,相比直接使用全局变量,我们最好使用local readonly这类的命令,其次我们可以使用declare来声明变量。这些方式都比使用全局方式定义要好。

函数返回值

在使用函数的时候一定要注意,shell中函数的返回值只能是整数,估计是因为一般情况下一个函数的返回值通常表示这个函数的运行状态,所以一般都是0或者是1就够了,因此就设计成了这样。不过,如果非得想传递字符串,也可以通过下面变通的方法:

func(){
echo "2333"
}

res=$(func)
echo "This is from $res."

这样,通过echo或者print之类的就可以做到传一些额外参数的目的。

实现一个简单的类shell脚本解释器_sftp shell脚本实现_shell 脚本解释器

间接引用值

什么叫间接引用?比如下面这个场景:

VAR1="2323232"
VAR2="VAR1"

我们有一个变量VAR1,又有一个变量VAR2,这个VAR2的值是VAR1的名字,那么我们现在想通过VAR2来获取VAR1的值,这时候应该怎么办呢?

比较土鳖的方法是这样:

eval echo \$$VAR2

啥意思呢?其实就是构造了一个字符串echo XXX,这个XXX就是XXX”,这个XXX就是VAR2的值VAR1,然后再用eval强制解析,这样就做到了变相取值。

这个用法的确可行,但是看起来十分的不舒服,很难直观的去理解,我们并不推荐。而且事实上我们本身就不推荐使用eval这个命令。

比较舒服的写法是下面这样:

echo ${!VAR1}

通过在变量名前加一个!就可以做到简单的间接引用了。

不过需要注意的是,用上面的方法,我们只能够做到取值,而不能做到赋值。如果想要做到赋值,还要老老实实的用eval来处理:

VAR1=VAR2
eval $VAR1=233
echo $VAR2

巧用heredocs

所谓heredocs,也可以算是一种多行输入的方法,即在”

来源:【九爱网址导航www.fuzhukm.com】 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    暂无相关资讯
实现一个简单的类shell脚本解释器 编写 Shell 脚本的最佳实践