千家信息网

shell编码规范有哪些

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,本篇文章给大家分享的是有关shell编码规范有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一,文件开头,指定默认解释器#!/usr
千家信息网最后更新 2025年12月02日shell编码规范有哪些

本篇文章给大家分享的是有关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/bashfunction main() {  echo $HAHA  return 0}main "$@"HAHA=zzexit 0

输出结果:

+ main+ echo+ return 0+ HAHA=zz+ exit 0

注意,以上代码,在main中是看不见"HAHA"这个全局变量的,因为main虽然不是程序入口,但是先于全局变量定义被调用,此时还未定义"HAHA",所以要求全局变量定义在脚本开头;

#! /bin/bashfunction main() {  echo $HAHA  return 0}HAHA=zzmain "$@"exit 0

输出为:

+ HAHA=zz+ main+ echo zzzz+ return 0+ exit 0

则符合预期;

b)全局变量和环境变量:

XX="ff" #全局变量export YY="zz" #环境变量

3,全局变量和readonly:

理论上全局变量或者环境变量最好应该都是"只读模式",所以声明 的时候可以指定为只读(readonly或者declare -r):

# Constantreadonly PATH_TO_FILES='/some/path'# Both constant and environmentdeclare -xr ORACLE_SID='PROD'

然而有时需要根据条件或者逻辑修改后作为"只读"使用,则最后一处修改后,可以指定为readonly,示例:

VERBOSE='false'while getopts 'v' flag; do  case "${flag}" in    v) VERBOSE='true' ;;  esacdonereadonly 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编码规范有哪些,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

0