他的输出结不雅就是2而不是1,如许显然不相符我们的编码习惯,很轻易造成一些问题。
是以,比拟直接应用全局变量,我们最好应用local readonly这类的敕令,其次我们可以应用declare来声明变量。这些方法都比应用全局方法定义要好。
函数返回值
既然是静态检查对象,就必定可以集成在CI框架里,shellcheck可以异常便利的集成在Travis CI中,供以shell脚本为主说话的项目进行静态检查。
所谓shebang其实就是在很多脚本的第一行出现的以”#!”开首的注释,他指清楚明了当我们没有指定说冥器的时刻默认的说冥器,一般可能是下面如许:
在应用函数的时刻必定要留意,shell中函数的返回值只能是整数,估计是因为一般情况下一?函数的返回值平日表示这个函数的运行状况,所以一般都是0或者是1就够了,是以就设计成了如许。不过,如不雅非得想传递字符串,也可以经由过程下面变通的办法:
- func(){ echo "2333" } res=$(func) echo "This is from $res."
如许,经由过程echo或者print之类的就可以做到传一些额外参数的目标。
什么叫借居引用?比如下面这个场景:
- VAR1="2323232"
- VAR2="VAR1"
我们有一个变量VAR1,又有一个变量VAR2,这个VAR2的值是VAR1的名字,那么我们如今想经由过程VAR2来获取VAR1的值,这时刻应当怎么办呢?
比较土鳖的办法是如许:
- echo ${!VAR1}
缩进针砭矩
这个用法切实其实可行,然则看起来十分的不舒畅,很难尽管的去懂得,我们并不推荐。并且事实上我们本身就不推荐应用eval这个敕令。
比较舒畅的写法是下面如许:
- echo ${!VAR1}
经由过程在变量名前加一个!就可以做到简单的借居引用了。
不过须要留意的是,用膳绫擎的办法,我们只可以或许做到取值,而不克不及做到赋值。
勤用双引号
巧用heredocs
所谓heredocs,也可以算是一种多行输入的办法,即在”<<”后定一个标识符,接着我们可以输入多行内容,直到再次碰到标识符为止。
应用heredocs,我们可以异常便利的生成一些模板文件:
- cat>>/etc/rsyncd.conf << EOF log file = /usr/local/logs/rsyncd.log transfer logging = yes log format = %t %a %m %f %b syslog facility = local3 EOF
学会查路径
当然,这里只是为了举一个例子,这个例子真正精确的用法应当是应用head -n1 file敕令。。。
很多情况下,我们会先获取当前脚本的路径,然后一这个路径为基准,去找其他的路径。平日我们是直接用pwd以期获得脚本的路径。
不过其拭魅如许是不严谨的,pwd获得的是当前shell的履行路径,而不是当前脚本的履行路径。
精确的做法应当是下面这两种:
- script_dir=$(cd $(dirname $0) && pwd)script_dir=$(dirname $(readlink -f $0 ))
应当先cd进当前脚本的目次然后再pwd,或者直接攫取当前脚本的地点路径。
代码要简短
这里的简短不单单是指代码长度,而是只用到的敕令数。原则上我们应当做到,能一条敕令解决的问题毫不消两条敕令解决。这不仅牵扯到代码的可读性,并且也关乎代码的履行效力。
最最经典的例子如下:
- cat /etc/passwd | grep root grep root /etc/passw
cat敕令最为人不齿的用法就是如许,用的没有任何意义,明明一条敕令可以解决,他非得加根管道。。。
其实代码简短在还能某种程度上能包管效力的晋升,比如下面的例子:
- #method1 find . -name '*.txt' |xargs sed -i s/233/666/g find . -name '*.txt' |xargs sed -i s/235/626/g find . -name '*.txt' |xargs sed -i s/333/616/g find . -name '*.txt' |xargs sed -i s/233/664/g
这两种办法做的工作都一样,就是查找所有的.txt后缀的文件并做一系列调换。前者是多次履行find,后者是履行一次find,然则增长了sed的模式串。第一种可读性更好一点,然则当调换的量变大年夜的时刻,第二种的速度就会比第一种快很多。这里效力晋升的原因,就是第二种只要履行一次敕令,而第一种要履行多次。
推荐阅读
比来在做 chrome 插件开辟,既然是插件那就不免纰谬现有页面做一些控制,比如事宜监听、调剂构造、对 DOM 元素的增删改查等等。个中有一个需求比较有意思,便整顿一基层便把涉及到的常识>>>详细阅读
本文标题:编写Linux Shell脚本的最佳实践
地址:http://www.17bianji.com/lsqh/36661.html
1/2 1