新聞中心
平常工作中,你是否感覺(jué)shell腳本只是命令的堆砌;很多時(shí)候只是為了實(shí)現(xiàn)功能而沒(méi)有好的組織結(jié)構(gòu);自己的腳本都不想再看一遍;哈哈,我這就教給shell的“葵花寶典“,自此讓你的shell腳本有python一樣的美感并且極易維護(hù),真的是shell腳本寫(xiě)到停不下來(lái)。

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),洪湖企業(yè)網(wǎng)站建設(shè),洪湖品牌網(wǎng)站建設(shè),網(wǎng)站定制,洪湖網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,洪湖網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
平常工作中,你是否感覺(jué)shell腳本只是命令的堆砌;很多時(shí)候只是為了實(shí)現(xiàn)功能而沒(méi)有好的組織結(jié)構(gòu);自己的腳本都不想再看一遍;哈哈,我這就教給shell的“葵花寶典“,自此讓你的shell腳本有python一樣的美感并且極易維護(hù),真的是shell腳本寫(xiě)到停不下來(lái)。
現(xiàn)以nginx控制腳本為例,看一下腳本的美容過(guò)程:
#!/bin/bash
# set命令的奇妙用途留在文章末尾
set -eu
# nginx重載配置文件
nginx -c /etc/nginx/nginx.conf -t
kill -HUP `ps auxf | grep -E "nginx:[[:space:]]+master"| awk '{print $2}'`
寶典秘籍之變量抽離
在腳本中,需要依賴(lài)外部的配置,比如配置文件位置,監(jiān)聽(tīng)端口之類(lèi)的可變參數(shù),編程時(shí),需要將其抽離為變量,為了更好的引用與維護(hù),省去了外部配置變化時(shí),一個(gè)個(gè)修改帶來(lái)的麻煩。
#!/bin/bash
# set命令的奇妙用途留在文章末尾
set -eu
# nginx配置文件在不同環(huán)境中,位置可能不同,所以需要將其抽離成可配置變量,腳本來(lái)引用
NGINX_CONFIG_FILE=/etc/nginx/nginx.conf
# nginx重載配置文件
nginx -c $NGINX_CONFIG_FILE -t
kill -HUP `ps auxf | grep -E "nginx:[[:space:]]+master"| awk '{print $2}'`
寶典秘籍之變量抽離
在腳本中,需要依賴(lài)外部的配置,比如配置文件位置,監(jiān)聽(tīng)端口之類(lèi)的可變參數(shù),編程時(shí),需要將其抽離為變量,為了更好的引用與維護(hù),省去了外部配置變化時(shí),一個(gè)個(gè)修改帶來(lái)的麻煩。
#!/bin/bash
# set命令的奇妙用途留在文章末尾
set -eu
# nginx配置文件在不同環(huán)境中,位置可能不同,所以需要將其抽離成可配置變量,腳本來(lái)引用
NGINX_CONFIG_FILE=/etc/nginx/nginx.conf
# nginx重載配置文件
nginx -c $NGINX_CONFIG_FILE -t
kill -HUP `ps auxf | grep -E "nginx:[[:space:]]+master"| awk '{print $2}'`
寶典秘籍之模塊化
運(yùn)維畢竟不是專(zhuān)業(yè)程序員,寫(xiě)腳本時(shí)是怎么舒服怎么來(lái),簡(jiǎn)單講就是從上到下依次執(zhí)行,這就導(dǎo)致復(fù)用性差,不易維護(hù),解決這問(wèn)題的關(guān)鍵在于函數(shù)化、模塊化思想,shell雖然是一種比較簡(jiǎn)單的語(yǔ)言,但語(yǔ)言基本的邏輯控制、函數(shù)功能都有,這就讓我們編寫(xiě)高質(zhì)量shell腳本帶了無(wú)限可能。接下來(lái)就看一下具體例子來(lái)感受一下:
# 由于nginx配置文件檢查是執(zhí)行其他操作的第一步,所以我們將其獨(dú)立成一個(gè)單獨(dú)函數(shù)
#!/bin/bash
# set命令的奇妙用途留在文章末尾
set -eu
# nginx配置文件在不同環(huán)境中,位置可能不同,所以需要將其抽離成可配置變量,腳本來(lái)引用
NGINX_CONFIG_FILE=/etc/nginx/nginx.conf
# 抽離配置文件檢查為單獨(dú)的函數(shù)
config_test() {
nginx -c $NGINX_CONFIG_FILE -t
}
get_nginx_master_pid(){
echo `ps auxf | grep -E "nginx:[[:space:]]+master"| awk '{print $2}'`
}
# 抽離配置重載為獨(dú)立函數(shù)
reload() {
kill -HUP `get_nginx_master_pid`
}
# nginx重載配置文件
config_test
reload
寶典秘籍之main函數(shù)
腳本的可維護(hù)性在于腳本的結(jié)構(gòu)的好壞,為了擁有更好的結(jié)構(gòu),通常需要在腳本中定義入口函數(shù),即main函數(shù),讓我在維護(hù)腳本時(shí),可以更好的把握腳本的組織架構(gòu),找到切入點(diǎn):
# 由于nginx配置文件檢查是執(zhí)行其他操作的第一步,所以我們將其獨(dú)立成一個(gè)單獨(dú)函數(shù)
#!/bin/bash
# set命令的奇妙用途留在文章末尾
set -eu
# nginx配置文件在不同環(huán)境中,位置可能不同,所以需要將其抽離成可配置變量,腳本來(lái)引用
NGINX_CONFIG_FILE=/etc/nginx/nginx.conf
# 抽離配置文件為單獨(dú)的函數(shù)
config_test() {
nginx -c $NGINX_CONFIG_FILE -t
}
get_nginx_master_pid(){
echo `ps auxf | grep -E "nginx:[[:space:]]+master"| awk '{print $2}'`
}
# 抽離配置重載為獨(dú)立函數(shù)
reload() {
kill -HUP `get_nginx_master_pid`
}
# 入口函數(shù)
main() {
config_test
reload
}
# main在此需要獲取腳本本身的參數(shù), 故將$@傳遞給main函數(shù)
main $@
寶典秘籍之函數(shù)返回值
在其他編程語(yǔ)言,可以通過(guò)return獲得函數(shù)的返回值,但是return語(yǔ)句在shell中含義不同,return命令會(huì)使一個(gè)函數(shù)返回,會(huì)返回一個(gè)單一的數(shù)字參數(shù),而這個(gè)數(shù)字參數(shù)在調(diào)用這個(gè)函數(shù)的腳本是可見(jiàn)的,如果沒(méi)有指定返回參數(shù),return在默認(rèn)情況下會(huì)返回上一次命令的返回代碼。那如何實(shí)現(xiàn)類(lèi)似其他編程語(yǔ)言的return效果呢?可以使用echo命令:
#!/bin/bash
set -eu
NGINX_CONFIG_FILE=/etc/nginx/nginx.conf
config_test() {
nginx -c $NGINX_CONFIG_FILE -t
}
# 在此處直接把nginx的master pid可以通過(guò)反引號(hào)來(lái)獲取echo后的值
get_nginx_master_pid(){
echo `ps auxf | grep -E "nginx:[[:space:]]+master"| awk '{print $2}'`
}
reload() {
# `get_nginx_master_pid` 獲得nginx master pid
kill -HUP `get_nginx_master_pid`
}
# 入口函數(shù)
main() {
config_test
reload
}
# main在此需要獲取腳本本身的參數(shù), 故將$@傳遞給main函數(shù)
main $@
寶典秘籍之set命令
bash內(nèi)置的set命令,可以改變我們腳本的執(zhí)行行為,讓我對(duì)腳本的把握和調(diào)試更有力,下面說(shuō)幾種常用的set指令,相信你都會(huì)喜歡的: set -e: bash腳本遇到錯(cuò)誤立即退出 set -n: 檢查腳本語(yǔ)法但不執(zhí)行 set -u: 遇到未設(shè)置的變量立即退出 set -o pipefail: 控制在管道符執(zhí)行過(guò)程中有錯(cuò)誤立即退出 set -x: 分步調(diào)試命令
在寫(xiě)腳本時(shí),我們可以直接在腳本開(kāi)頭簡(jiǎn)寫(xiě)為如下格式:
#!/bin/bash
set -euxo pipefail
檢查bash腳本的語(yǔ)法時(shí),可以這樣寫(xiě):
bash -n main.sh
網(wǎng)站題目:對(duì)shell腳本進(jìn)行“美化”
轉(zhuǎn)載源于:http://www.dlmjj.cn/article/dhjjgpi.html


咨詢(xún)
建站咨詢(xún)
