Linux Shell指令碼編程的注意事項_linux shell

來源:互聯網
上載者:User

一、常用技巧

複製代碼 代碼如下:
ssh user@server bash < /path/to/local/script.sh
#ssh到遠程伺服器執行一個指令碼,此命令可以避免將指令碼上傳到遠程伺服器

ssh user@host cat /path/to/remotefile | diff /path/to/localfile -
#比較遠程檔案和本地檔案的差異

vim scp://username@host//path/to/somefile
#vi一個遠程檔案

curl ifconfig.me
#在內網下查看公網ip

echo ${#a}
#取變數字元個數

FUNCNAME
#函數名變數,列印該變數會輸出當前的函數名稱

二.變數命名

1.變數命名前後規則統一

複製代碼 代碼如下:
COUNT=
Sum=

2.避免無含義字元或數字,例如下面的18,誰知道代表什麼含義呢
複製代碼 代碼如下:

#-------------------錯誤寫法-------------------
if [[ $count -gt 18 ]]
then
commmand
fi
#----------------------------------------------

#-------------------正確寫法-------------------
Process_Limit=18
if [[ $count -gt ${Process_Limit} ]]
then
commmand
fi
#----------------------------------------------

3.全域變數在指令碼初始化的時候定義,一般是一些配置參數, 盡量少的使用全域變數
4.函數內的局部變數使用local聲明
複製代碼 代碼如下:

func_test_1()
{
local test=1
echo $test
}

5.變數合并
如果某些變數需要組合起來才有意義時,例如檔案路徑等,請將組合起來的值賦予一個變數,這樣以後修改起來方便
複製代碼 代碼如下:

log_dir=/opt/log
log_name=website.log
#-------------------錯誤寫法-------------------
if [[ ! -f ${log_dir}/mam/${log_name} ]]
then
touch ${log_dir}/mam/${log_name}
fi
#----------------------------------------------

#-------------------正確寫法-------------------
log_file=${log_dir}/${log_name}
if [[ ! -f ${log_file} ]]
then
touch ${log_file}
fi
#----------------------------------------------

6.異常判斷,判斷變數名是否存在,對於輸入變數,還需要判斷變數名的合法性
複製代碼 代碼如下:

#-------------------錯誤寫法-------------------
rm -rf ${path}/*
#----------------------------------------------

 
#-------------------正確寫法-------------------
if [ -d "${path}" ]
then
rm -rf ${path}/*
fi
#----------------------------------------------

7.雙中括弧的使用[[ ]]
shell的雙中括弧有很多的作用
複製代碼 代碼如下:

#----------------------------------------------
正則匹配
if [[ Yes =~ Y|y ]]
then
echo matched
fi
#----------------------------------------------

#----------------------------------------------
防止空變數,以下if判斷,如果使用[]則會報錯
if [[ $aaa == 1 ]]
then
echo matched
else
echo "no such variable"
fi
#----------------------------------------------

8.使用ctrl+n補齊變數名
如果變數名的命名比較長,手輸入容易出錯,複製又太麻煩,則可以使用ctrl+n補齊變數名
操作可以避免手工輸入導致的變數名錯誤

三.臨時檔案

盡量避免使用臨時檔案
如果需要使用臨時檔案,請在檔案名稱中加入指令碼pid,並在指令碼退出前清除臨時檔案
mktemp命令可以用來產生一個臨時檔案
tmp_file_name=$(mktemp TMP.XXXXXX)
該命令會產生一個檔案名稱為TMP.XXXXXX(其中XXXXXX為6位隨機碼)的檔案
這樣做可以避免指令碼並行時,臨時檔案名稱的衝突

四.代碼風格

1.第一行申明解析器

複製代碼 代碼如下:

#!/bin/bash

2.第二行匯入環境變數
複製代碼 代碼如下:

. ~/.bash_profile (這個在cron指令碼中尤其重要)

3.尋找指令碼自身路徑
很多指令碼沒有定義起始目錄,這樣將導致指令碼只能在目前的目錄下執行

4.條件陳述式和迴圈語句風格統一
使用shell統一格式,而非;

複製代碼 代碼如下:

#-------------------錯誤寫法-------------------
if [[ ]] ;then
command1
fi
while [[ ]] ;do
command2
done
#----------------------------------------------

#-------------------正確寫法-------------------
if [[ ]]
then
command1
fi

while [[ ]]
do
command2
done
#----------------------------------------------

5.縮排,使用TAB或者空格,不要兩者混用
想檢查一個技術人員是否經驗豐富,那麼看看他的電子檔簡曆吧,是否TAB和空格混用了

6.添加註釋
沒有注釋的指令碼,註定難以維護,當然,我們也應該避免一些毫無意義的注釋

複製代碼 代碼如下:

#-------------------錯誤寫法-------------------
#將3賦值給變數load_limit
load_limit=3
#----------------------------------------------
大哥,您這是在逗我玩兒嗎?

#-------------------正確寫法-------------------
#定義系統負載閥值
load_limit=3
#----------------------------------------------

五.介面化編程

當多個指令碼需要協調工作時,應該根據各自模組的功能,定義相應的介面
例如,多個指令碼需要讀取同一個設定檔的配置,那麼將這個需求形成一個獨立的指令碼,各個指令碼都來調用這個介面指令碼
這樣在修改設定檔格式的時候,只要修改這個介面就行了

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.