shell编码规范有哪些

发布时间:2021-08-03 10:56:33 作者:Leah
来源:亿速云 阅读:176

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

推荐阅读:
  1. Java的编码规范有哪些
  2. Python 编码规范有哪些

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

shell

上一篇:python中Numpy基础操作的示例分析

下一篇:如何解决某些HTML字符打不出来的问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》