天天看點

shell腳本的一些注意事項

sshuser@serverbash</path/to/local/script.sh

ssh到遠端伺服器執行一個腳本,此指令可以避免将腳本上傳到遠端伺服器

sshuser@hostcat/path/to/remotefile|diff/path/to/localfile-

比較遠端檔案和本地檔案的差異

vimscp://username@host//path/to/somefile

vi一個遠端檔案

curlifconfig.me

在内網下檢視公網ip

echo${#a}

取變量字元個數

FUNCNAME

函數名變量,列印該變量會輸出目前的函數名稱

一.變量命名

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

COUNT=

Sum=

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

-------------------錯誤寫法-------------------

if[[$count-gt18]]

then

commmand

fi

----------------------------------------------

-------------------正确寫法-------------------

Process_Limit=18

if[[$count-gt${Process_Limit}]]

3.全局變量在腳本初始化的時候定義,一般是一些配置參數,盡量少的使用全局變量

4.函數内的局部變量使用local聲明

func_test_1()

{

localtest=1

echo$test

}

5.變量合并

如果某些變量需要組合起來才有意義時,例如檔案路徑等,請将組合起來的值賦予一個變量,這樣以後修改起來友善

log_dir=/opt/log

log_name=website.log

if[[!-f${log_dir}/mam/${log_name}]]

touch${log_dir}/mam/${log_name}

log_file=${log_dir}/${log_name}

if[[!-f${log_file}]]

touch${log_file}

6.異常判斷,判斷變量名是否存在,對于輸入變量,還需要判斷變量名的合法性

rm-rf${path}/*

if[-d"${path}"]

7.雙中括号的使用[[]]

shell的雙中括号有很多的作用

正則比對

if[[Yes=~Y|y]]

echomatched

防止空變量,以下if判斷,如果使用[]則會報錯

if[[$aaa==1]]

else

echo"nosuchvariable"

8.使用ctrl+n補齊變量名

如果變量名的命名比較長,手輸入容易出錯,複制又太麻煩,則可以使用ctrl+n補齊變量名

操作可以避免手工輸入導緻的變量名錯誤

二.臨時檔案

盡量避免使用臨時檔案

如果需要使用臨時檔案,請在檔案名中加入腳本pid,并在腳本退出前清除臨時檔案

mktemp指令可以用來生成一個臨時檔案

tmp_file_name=$(mktempTMP.XXXXXX)

該指令會生成一個檔案名為TMP.XXXXXX(其中XXXXXX為6位随機碼)的檔案

這樣做可以避免腳本并行時,臨時檔案名的沖突

三.代碼風格

1.第一行申明解析器

#!/bin/bash

2.第二行導入環境變量

.~/.bash_profile(這個在cron腳本中尤其重要)

3.查找腳本自身路徑

很多腳本沒有定義起始目錄,這樣将導緻腳本隻能在目前目錄下執行

4.條件語句和循環語句風格統一

使用shell統一格式,而非;

if[[]];then

command1

while[[]];do

command2

done

if[[]]

while[[]]

do

5.縮進,使用TAB或者空格,不要兩者混用

想檢查一個技術人員是否經驗豐富,那麼看看他的電子檔履歷吧,是否TAB和空格混用了

6.添加注釋

沒有注釋的腳本,注定難以維護,當然,我們也應該避免一些毫無意義的注釋

#将3指派給變量load_limit

load_limit=3

大哥,您這是在逗我玩兒嗎?

#定義系統負載閥值

四.接口化程式設計

當多個腳本需要協調工作時,應該根據各自子產品的功能,定義相應的接口

例如,多個腳本需要讀取同一個配置檔案的配置,那麼将這個需求形成一個獨立的腳本,各個腳本都來調用這個接口腳本

這樣在修改配置檔案格式的時候,隻要修改這個接口就行了

本文轉自大角牛部落格51CTO部落格,原文連結http://blog.51cto.com/jingshengsun888/1319934如需轉載請自行聯系原作者

運維的戲子