欧美午夜视频一区二区在线观看_日本中文不卡影片_婷婷五月激情影院_中文字幕亚洲综合小综合片源丰富、内容全面_97中文字幕永久在线_玩弄初次红杏出墙少妇_国产野外无码理论片_国产对白刺激视频

返回全部

Bash 代碼優(yōu)化思考

最近我在思考這樣一個(gè)問題,順便看一下gpt對(duì)這個(gè)問題的解釋。搜索發(fā)現(xiàn):

團(tuán)隊(duì)寫代碼,為什么要遵循coding guideline?

  • 一致性:編碼準(zhǔn)則確保整個(gè)團(tuán)隊(duì)的代碼風(fēng)格和格式是一致的,這使得團(tuán)隊(duì)成員之間更易于交流和協(xié)作。這也使得代碼更容易維護(hù)和更新,因?yàn)槠渌丝梢愿p松地理解代碼。
  • 可讀性:編碼準(zhǔn)則有助于提高代碼的可讀性。通過對(duì)代碼進(jìn)行格式化和注釋,代碼會(huì)更易于閱讀和理解,從而減少錯(cuò)誤和缺陷,并提高代碼的質(zhì)量。
  • 可維護(hù)性:編碼準(zhǔn)則有助于提高代碼的可維護(hù)性。通過使用一致的格式和風(fēng)格,團(tuán)隊(duì)成員可以更輕松地理解代碼,并進(jìn)行更快速的故障排除和修復(fù)。
  • 代碼質(zhì)量:編碼準(zhǔn)則有助于提高代碼的質(zhì)量。通過要求團(tuán)隊(duì)成員編寫可讀性高、可維護(hù)性強(qiáng)的代碼,編碼準(zhǔn)則可以確保代碼更加健壯、可靠和安全。這也有助于減少代碼缺陷和錯(cuò)誤,提高代碼的可靠性和可用性。
  • 代碼重用:編碼準(zhǔn)則有助于提高代碼的重用性。通過編寫符合標(biāo)準(zhǔn)的代碼,團(tuán)隊(duì)成員可以更容易地將代碼重用在其他項(xiàng)目中,從而提高生產(chǎn)力和效率。
  • 繼續(xù)搜索:

    對(duì)于一個(gè)使用bash為主要語(yǔ)言的項(xiàng)目,業(yè)界推薦的coding guideline?

  • 使用有意義的變量名:變量名應(yīng)該具有描述性,以便其他人可以輕松地理解代碼。
  • 縮進(jìn):使用4個(gè)空格作為縮進(jìn),而不是制表符。
  • 注釋:對(duì)代碼進(jìn)行注釋,以解釋代碼的目的和功能。注釋應(yīng)該清晰、簡(jiǎn)潔,并且易于閱讀。
  • 函數(shù):編寫短小精悍的函數(shù),每個(gè)函數(shù)都應(yīng)該具有一個(gè)特定的目的。函數(shù)應(yīng)該使用有意義的名稱,并且應(yīng)該清晰地描述其目的和功能。
  • 錯(cuò)誤處理:在代碼中包含錯(cuò)誤處理,以確保代碼在遇到錯(cuò)誤時(shí)不會(huì)崩潰或產(chǎn)生不可預(yù)測(cè)的結(jié)果。
  • 使用雙引號(hào):在引用變量時(shí),使用雙引號(hào)而不是單引號(hào),以確保變量擴(kuò)展能夠正常工作。
  • 使用全局變量:盡量避免使用全局變量,因?yàn)樗鼈兒茈y調(diào)試和維護(hù)。
  • 使用命令替換:使用$()語(yǔ)法而不是反引號(hào) ``來執(zhí)行命令替換。
  • 使用數(shù)組:使用數(shù)組來管理相關(guān)變量,而不是使用多個(gè)單獨(dú)的變量。
  • 使用“set -u”:使用“set -u”來檢查未定義的變量,以避免在引用未定義的變量時(shí)產(chǎn)生錯(cuò)誤。
  • 這些規(guī)范有助于提高 Bash 代碼的可讀性、可維護(hù)性和可靠性。

    然后我搜索 "bash script style guideline",最上面的結(jié)果是:

    即代碼規(guī)范:https://google.github.io/styleguide/shellguide.html

    我仔細(xì)閱讀了這份風(fēng)格指南,對(duì)其中的“局部變量”的章節(jié)很感興趣。

    文中說:「最好把局部變量的定義與賦值,換行實(shí)現(xiàn),不要寫到同一行上」,以免掩蓋報(bào)錯(cuò)狀態(tài)碼。

    原文

    我動(dòng)手驗(yàn)證這個(gè)細(xì)節(jié),發(fā)現(xiàn)果然如此:

    然后我開始自查當(dāng)前的項(xiàng)目,尋找類似于如下風(fēng)格的代碼:

    local my_var="$(my_func)"

    優(yōu)化后的預(yù)期結(jié)果:

    local my_var
    my_var="$(my_func)"

    在 https://regex101.com/ 測(cè)試代碼的運(yùn)行。給出范例

    regex:  
      local fn=$(echo $name_ver| tr ':' '-').tar.xz
    test string
      local fn=$(echo $name_ver| tr ':' '-').tar.xz     #普通
        local fn=$(echo $name_ver| tr ':' '-').tar.xz   # 模擬多個(gè)空格
        local fn=$(echo $name_ver| tr ':' '-').tar.xz       # 模擬tab縮進(jìn)
        local fn="$(echo $name_ver| tr ':' '-').tar.xz" # 模擬帶引號(hào)的變量聲明

    測(cè)似乎生成的代碼

    $1local $2\n$1$2=$3

    生成的代碼

    $re = '/^(\s*)local\s+(\w+)=("?\$\(.*)/m';
    $str = '  local fn=$(echo $name_ver| tr \':\' \'-\').tar.xzt
        local fn=$(echo $name_ver| tr \':\' \'-\').tar.xzt
        local fn=$(echo $name_ver| tr \':\' \'-\').tar.xz
        local fn="$(echo $name_ver| tr \':\' \'-\').tar.xz"';
    $subst = "$1local $2\n$1$2=$3";
    
    $result = preg_replace($re, $subst, $str);
    
    echo "The result of the substitution is ".$result;

    精簡(jiǎn)為 perl_oneliner:

    perl -pe 's/^(\s*)local\s+(\w+)=("?\$\(.*)/$1local $2\n$1$2=$3/g' -i file.txt

    測(cè)試的場(chǎng)景:

    搜索代碼

    pcregrep -lr '^(\s*)local\s+(\w+)=("?\$\(.*)' *

    批量修正:

    perl -pi -e 's#^(\s*)local\s+(\w+)=("?\$\(.*)#$1local $2\n$1$2=$3#' $(pcregrep -l -r '^(\s*)local\s+(\w+)=("?\$\(.*)' * )

    修正之后,仔細(xì)閱讀diff,檢驗(yàn)效果,發(fā)現(xiàn)符合預(yù)期。

    后續(xù):增加git hook檢測(cè)代碼

    為了讓以后新增的代碼,也都符合上述規(guī)范,我增加了這樣一個(gè)pre-commit腳本。這樣,每次提交之前,它都會(huì)幫我確保代碼合規(guī)。

    同時(shí),我在編輯器里,設(shè)置了shfmt、shellcheck之類的規(guī)范,并設(shè)置為format on save,即保存時(shí)自動(dòng)格式化,來自動(dòng)處理格式問題。

    # test code 
    if ! grep -wq 'Code violates rules' .git/hooks/pre-commit; then
    cat >> .git/hooks/pre-commit <<'GIT_PRE_COMMIT_EOF'                                                                                                                                        
    #!/usr/bin/env bash
    if find . -name '*.sh'| xargs pcregrep '^\s+local\s+\w+="?(`|\$\()'; then
      echo "Error: Code violates rules"
      echo 'use: local var'
      echo 'var="$(...")'
      echo 'instead of local var=``'
      echo 'or local var="$(...)"'
      echo 'as of explained in https://google.github.io/styleguide/shellguide.html'
      exit 1
    fi
    GIT_PRE_COMMIT_EOF
    chmod +x .git/hooks/pre-commit
    fi

    總結(jié):

  • 尋找業(yè)界規(guī)范
  • 遵循規(guī)范
  • 修改過去不合規(guī)范的代碼
  • 新增代碼確保合規(guī)
  • 將代碼的規(guī)范檢查,加入到日常的流程里。(goimport check)
  • 越早做,歷史包袱越少。越晚做,歷史包袱越沉重。
  • related PR: https://git.yunion.io/projects/CLOUD/repos/yunion-build/pull-requests/1355/diff#main.sh
  • links

  • Checks · koalaman/shellcheck Wiki
  • ShellCheck - A shell script static analysis tool
  • styleguide | Style guides for Google-originated open-source projects*
  • regex101: build, test, and debug regex
  • 以上是文章的主要內(nèi)容,作為融合云/多云管理/私有云/FinOps 廠商,云聯(lián)壹云會(huì)持續(xù)關(guān)注這些領(lǐng)域的動(dòng)態(tài),分享相關(guān)的信息和技術(shù),可以通過的官網(wǎng)或關(guān)注的公眾號(hào)(云聯(lián)壹云)來獲取最新的信息,感謝大家的時(shí)間。

    其他推薦閱讀

    云聯(lián)壹云融合云管理平臺(tái)的 10 大應(yīng)用場(chǎng)景

    SkyPilot:構(gòu)建在多云之上的ML和數(shù)據(jù)科學(xué),可節(jié)約3倍以上成本

    Flexera 2023 云狀態(tài)報(bào)告解讀

    新品發(fā)布 | Cloudpods 3.10版本上線!

    企業(yè)面對(duì)FinOps,到底能做些什么?總結(jié)了4個(gè)方面

    目錄
    其它

    技術(shù)支持

    技術(shù)支持

    掃碼加入技術(shù)支持微信群

    掃碼加入技術(shù)支持微信群


    公眾號(hào)

    官方公眾號(hào)

    掃碼關(guān)注獲取最新動(dòng)態(tài)