shell腳本的一些注意事項

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
  ----------------------------------------------

四.接口化編程
當多個腳本需要協調工作時,應該根據各自模塊的功能,定義相應的接口
例如,多個腳本需要讀取同一個配置文件的配置,那麼將這個需求形成一個獨立的腳本,各個腳本都來調用這個接口腳本
這樣在修改配置文件格式的時候,只要修改這個接口就行了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章