您好,登录后才能下订单哦!
本篇文章给大家分享的是有关shell编码规范有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
#!/usr/bin/env bash
大部分情况下等同于
#!/bin/bash
解释:
1,shell解释器有很多种,但是一般不同的解释器支持的命令范围不同,例如sh支持的命令就比bash少很多(这也是sh为鼻祖,但是bash能后来居上的原因)
2,shell脚本是解释执行的,在遇到 第一行#! /bin/bash的时候,会去加载bash相关的环境,在遇到#! /bin/sh时会加载sh相关的环境,但是不同的机器环境可能安装了不同的shell,为了可移植考虑,#!/usr/bin/env bash会自己判断使用的shell是什么,并加载响应的环境变量;
1,一般使用两个空格作为缩进,不要使用tab
2,不在一行的时候,使用"\"进行换行,换行的原则是整齐美观;
cat "$0"|grep -v "less \"\$0\"" \ |grep -B1 "function " \ |grep -v "\\--" \ |sed "s/function //g" \ |sed "s/(){//g" \ |sed "s/#//g"
1,使用变量的时候,变量名一定要用{}包裹
2,使用变量的时候一定要用双引号""包裹,示例:
var1="Hello World" #正确,推荐使用双引号 var2='Hello World' #正确,不推荐使用单引号 var3="${var1}" #应用前面定义的变量的时候也要使用双引号包裹 var4=6 var5=6.70 #小数 var3=${var1} #正确,不推荐
说明:
a)单引号和双引号的区别:
单引号里面任何字符都会原样输出--即单引号中变量是无效的;单引号字串中不能出现单引号--即使使用对单引号的转义都不行;
双引号中的字符都会原样输出,但是使用$取值的变量会替换为变量值,双引号中可以出现单引号;
1,常量要求一般定义在脚本开头,名字全大写
2,如果常量定义为readonly,则不能使用source跨shell使用,如
readonly ZZ=5
1,函数中定义变量,一定要用local修饰,这样函数外有重名,以及多个shell不会有冲突;
2,变量一经定义,不允许使用unset删除
3,当赋值的值由命令替换提供时,声明和赋值要分开。因为内建的local不会从替换命令中传递退出码:
my_func2() { local name="$1" # Separate lines for declaration and assignment: local my_var my_var="$(my_func)" || return # DO NOT do this: $? contains the exit code of 'local', not my_func local my_var="$(my_func)" [[ $? -eq 0 ]] || return ... }
1,shell中的变量的基本类型就是string,数值,boolen(可看做是数值的变种,定义时也是a=0,但这里注意一下0标识真,状态码也一样,与c++等的不同之处)
readonly TURN=0 && readonly FALSE=1
1,定义在函数中的我们称之为函数的局部变量,定义在函数外部,shell脚本中,我们认为它是脚本的全局变量,全脚本内从变量定义开始的位置到脚本结束以及source该脚本的脚本都可见
2,环境变量:所有的程序,包括shell启动的程序(子进程),都能访问环境变量,必要的时候shell也可以自己通过export xx=a定义自己的环境变量(对其子进程可见)
ps,全局变量的位置:
#! /bin/bash function main() { echo $HAHA return 0 } main "$@" HAHA=zz exit 0
输出结果:
+ main + echo + return 0 + HAHA=zz + exit 0
注意,以上代码,在main中是看不见“HAHA”这个全局变量的,因为main虽然不是程序入口,但是先于全局变量定义被调用,此时还未定义“HAHA”,所以要求全局变量定义在脚本开头;
#! /bin/bash function main() { echo $HAHA return 0 } HAHA=zz main "$@" exit 0
输出为:
+ HAHA=zz + main + echo zz zz + return 0 + exit 0
则符合预期;
b)全局变量和环境变量:
XX="ff" #全局变量 export YY="zz" #环境变量
3,全局变量和readonly:
理论上全局变量或者环境变量最好应该都是”只读模式“,所以声明 的时候可以指定为只读(readonly或者declare -r):
# Constant readonly PATH_TO_FILES='/some/path' # Both constant and environment declare -xr ORACLE_SID='PROD'
然而有时需要根据条件或者逻辑修改后作为”只读“使用,则最后一处修改后,可以指定为readonly,示例:
VERBOSE='false' while getopts 'v' flag; do case "${flag}" in v) VERBOSE='true' ;; esac done readonly VERBOSE
1,使用function定义的函数为public函数,可以供外部脚本以“sh 脚本 函数 函数入参”的形式调用;未使用function关键字显示定义的为private函数,仅供脚本内部调用
ps:注意这种语法不是shell语法,是人为规定的规范;
function main(){ #函数执行的操作 #函数的返回结果 } #或者 main(){ #函数执行的操作 #函数的返回结果 }
2,函数内部首先使用有意义的变量名(以及local)接收参数,然后操作变量,禁止使用$1,$2这种,除非只使用一次;
3,函数返回值:
return:函数的return只能返回[0-255]的值--实际上shell不认为它是常规意义上的返回值,而是函数执行状态后的返回码;当然如果我们想拿返回值的时候,可以用 res=$?,而不是res=functest
echo:如果想函数返回字符串,则可以在函数最后echo,外面用res=functest接收
function functest() { echo "this is test" return 10 } echo_res=functest # echo_res 值为 "this is test" ret_res=$? # ret_res 值为10
4,父子进程延展echo
如“3”中的写法,函数中所有echo的字符串,都会被echo_res接收,但是在函数中我们有不想返回的内容,只想打印一行日志,则可以使用“()”将对应echo包裹,实例:
function functest() { (echo "this is a log") #不会被外部变量接收 echo "this is result" #作为函数返回值被外部接收 return 0 }
原理:shell中 子shell 可以理解成闭包,可以捕获父shell的变量,但不能改变父shell的变量,使用()将代码块包裹,包裹的代码块将在子shell中运行,子shell相当于独立的一个环境,虽然能够继承父进程的变量,但是不能修改;不会影响到父shell的结果
以上就是shell编码规范有哪些,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。