shell编码规范有哪些

本篇文章给大家分享的是有关shell编码规范有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

坚守“ 做人真诚 · 做事靠谱 · 口碑至上 · 高效敬业 ”的价值观,专业网站建设服务10余年为成都PE包装袋小微创业公司专业提供成都定制网站营销网站建设商城网站建设手机网站建设小程序网站建设网站改版,从内容策划、视觉设计、底层架构、网页布局、功能开发迭代于一体的高端网站建设服务。

一,文件开头,指定默认解释器

#!/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编码规范有哪些,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。


分享名称:shell编码规范有哪些
文章路径:http://cdiso.cn/article/poigoe.html

其他资讯