您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。