溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

shell編碼規(guī)范有哪些

發(fā)布時間:2021-08-03 10:56:33 來源:億速云 閱讀:176 作者:Leah 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關shell編碼規(guī)范有哪些,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

一,文件開頭,指定默認解釋器

#!/usr/bin/env bash

大部分情況下等同于

#!/bin/bash

解釋:

1,shell解釋器有很多種,但是一般不同的解釋器支持的命令范圍不同,例如sh支持的命令就比bash少很多(這也是sh為鼻祖,但是bash能后來居上的原因)

2,shell腳本是解釋執(zhí)行的,在遇到 第一行#! /bin/bash的時候,會去加載bash相關的環(huán)境,在遇到#! /bin/sh時會加載sh相關的環(huán)境,但是不同的機器環(huán)境可能安裝了不同的shell,為了可移植考慮,#!/usr/bin/env bash會自己判斷使用的shell是什么,并加載響應的環(huán)境變量;

二,關于縮進:

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            #小數(shù)
    var3=${var1}         #正確,不推薦

說明:

a)單引號和雙引號的區(qū)別:

單引號里面任何字符都會原樣輸出--即單引號中變量是無效的;單引號字串中不能出現(xiàn)單引號--即使使用對單引號的轉義都不行;

雙引號中的字符都會原樣輸出,但是使用$取值的變量會替換為變量值,雙引號中可以出現(xiàn)單引號;

四,常量:

1,常量要求一般定義在腳本開頭,名字全大寫

2,如果常量定義為readonly,則不能使用source跨shell使用,如

readonly ZZ=5

五,局部變量:

1,函數(shù)中定義變量,一定要用local修飾,這樣函數(shù)外有重名,以及多個shell不會有沖突;

2,變量一經(jīng)定義,不允許使用unset刪除

3,當賦值的值由命令替換提供時,聲明和賦值要分開。因為內(nèi)建的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,數(shù)值,boolen(可看做是數(shù)值的變種,定義時也是a=0,但這里注意一下0標識真,狀態(tài)碼也一樣,與c++等的不同之處

readonly TURN=0 && readonly FALSE=1

七,關于全局變量和環(huán)境變量:

1,定義在函數(shù)中的我們稱之為函數(shù)的局部變量,定義在函數(shù)外部,shell腳本中,我們認為它是腳本的全局變量,全腳本內(nèi)從變量定義開始的位置到腳本結束以及source該腳本的腳本都可見

2,環(huán)境變量:所有的程序,包括shell啟動的程序(子進程),都能訪問環(huán)境變量,必要的時候shell也可以自己通過export xx=a定義自己的環(huán)境變量(對其子進程可見)

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雖然不是程序入口,但是先于全局變量定義被調(diào)用,此時還未定義“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)全局變量和環(huán)境變量:

XX="ff" #全局變量
export YY="zz" #環(huán)境變量

3,全局變量和readonly:

理論上全局變量或者環(huán)境變量最好應該都是”只讀模式“,所以聲明 的時候可以指定為只讀(readonly或者declare -r):

# Constant
readonly PATH_TO_FILES='/some/path'

# Both constant and environment
declare -xr ORACLE_SID='PROD'

然而有時需要根據(jù)條件或者邏輯修改后作為”只讀“使用,則最后一處修改后,可以指定為readonly,示例:

VERBOSE='false'
while getopts 'v' flag; do
  case "${flag}" in
    v) VERBOSE='true' ;;
  esac
done
readonly VERBOSE

八,關于函數(shù):

1,使用function定義的函數(shù)為public函數(shù),可以供外部腳本以“sh 腳本 函數(shù) 函數(shù)入?yún)ⅰ钡男问秸{(diào)用;未使用function關鍵字顯示定義的為private函數(shù),僅供腳本內(nèi)部調(diào)用

ps:注意這種語法不是shell語法,是人為規(guī)定的規(guī)范;

function main(){
  #函數(shù)執(zhí)行的操作
  #函數(shù)的返回結果
}

#或者

main(){
  #函數(shù)執(zhí)行的操作
  #函數(shù)的返回結果
}

2,函數(shù)內(nèi)部首先使用有意義的變量名(以及l(fā)ocal)接收參數(shù),然后操作變量,禁止使用$1,$2這種,除非只使用一次;

3,函數(shù)返回值:

return:函數(shù)的return只能返回[0-255]的值--實際上shell不認為它是常規(guī)意義上的返回值,而是函數(shù)執(zhí)行狀態(tài)后的返回碼;當然如果我們想拿返回值的時候,可以用 res=$?,而不是res=functest

echo:如果想函數(shù)返回字符串,則可以在函數(shù)最后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”中的寫法,函數(shù)中所有echo的字符串,都會被echo_res接收,但是在函數(shù)中我們有不想返回的內(nèi)容,只想打印一行日志,則可以使用“()”將對應echo包裹,實例:

function functest() {
  (echo "this is a log") #不會被外部變量接收
  echo "this is result"  #作為函數(shù)返回值被外部接收
  return 0
}

原理:shell中 子shell 可以理解成閉包,可以捕獲父shell的變量,但不能改變父shell的變量,使用()將代碼塊包裹,包裹的代碼塊將在子shell中運行,子shell相當于獨立的一個環(huán)境,雖然能夠繼承父進程的變量,但是不能修改;不會影響到父shell的結果

以上就是shell編碼規(guī)范有哪些,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI