中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

shell編碼規范有哪些

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

本篇文章給大家分享的是有關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編碼規范有哪些,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

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

AI

麟游县| 错那县| 鄂托克旗| 邳州市| 建德市| 缙云县| 东辽县| 托里县| 壶关县| 措勤县| 合山市| 浏阳市| 昌邑市| 苏尼特右旗| 嵩明县| 东乡族自治县| 郁南县| 长春市| 从江县| 库车县| 宿迁市| 资兴市| 怀化市| 望城县| 江门市| 天峨县| 晋江市| 肥城市| 冀州市| 屏边| 甘洛县| 丰都县| 阜宁县| 虎林市| 安新县| 皮山县| 驻马店市| 资中县| 油尖旺区| 延边| 齐河县|