編寫Shell腳本

編寫好的Shell腳本linux

一個好的腳本的要素shell

這是繼上一篇Shell腳本教程以後,咱們須要一些東西要考慮:bash

  1. 腳本應該是無錯誤(error)的運行
  2. 腳本應該按照咱們預想的軌跡進行執行
  3. 腳本的邏輯必須清晰
  4. 不作無用的事情
  5. 代碼最好是可複用的

代碼結構ide

shell腳本的代碼結構是很是靈活的。儘管Bash賦予了使用者極大的自由,可是你的代碼最好要可以擁有明確而正確的邏輯以便用戶能夠容易的使用。當你想要書寫shell的時候,請必定捫心自問如下幾個問題oop

  • 是要求用戶輸入參數和信息仍是從用戶的環境中取獲取這些參數和信息呢?
  • 我該如何保存這些參數和信息呢
  • 是否須要建立新文件呢?建立的全部者和權限值呢?
  • 我該使用什麼命令來達成目的呢?在須要運行的系統上是否有這些命令?移植性如何呢?
  • 使用者是否須要一些文字提示?何時以及提示內容是什麼呢?

屬於this

仍是約定一下術語spa

術語 含義
Command control 經過命令的返回值來肯定語句是否已經執行
Conditional Branch 用來判斷事件是否發生的程序點
Logic Flow 程序的總體設計,以便肯定程序的執行是按照咱們指望的邏輯和順序執行的
Loop 執行0-屢次的程序塊
User Input 再程序運行時候由外部提供的信息,能夠在程序中一次或者屢次的使用

有序的程序操作系統

在我們開發shell腳本以前,爲了提升開發的進度,應該先想想程序的邏輯。設計

一段即將使用的方法以及常常會使用的命令列表,並列出我們即將要作的事情以及程序容許作什麼事情,一些明顯的任務就會顯露出來。unix

用我們最熟悉的語言將程序描繪出來並找出主幹的行爲能夠令寫出的程序更加的易懂。而後就能夠將這些語言所有替換爲shell了。

一個Bash的例子

下面的這個shell會使用一些著名的shell命令來查看你的電腦信息

cat -n mysystem.sh
#!/bin/bash
echo "this is my system info ,and now program start"

echo "hello $USER"
echo 

echo "today's date is `date`, this is week `date +"%V"`."
#注意+號後面不能有空格喲
echo

echo "these user are currnt conneted:"
w | cut -d "" -f 1 - | grep -v USER | sort -u
echo

echo "this is `uname -s` running on `uname -m` processor."
echo

echo "this is uptime information"
uptime
echo

echo "that's all forks!"

shell腳本應該由#!來開頭,在第一行定義以後,shell命令就能夠執行了。上述的程序就不解釋了,命令不懂的就自行百度吧。太累了唉。

用printf內建命令輸出的話,上面的腳本就是這個樣子

cat mysystem.sh
#!/bin/bash
clear
printf "This is information provided by mysystem.sh.  Program starts now.\n"

printf "Hello, $USER.\n\n"

printf "Today's date is `date`, this is week `date +"%V"`.\n\n"

printf "These users are currently connected:\n"
w | cut -d " " -f 1 - | grep -v USER | sort -u
printf "\n"

printf "This is `uname -s` running on a `uname -m` processor.\n\n"

printf "This is the uptime information:\n"
uptime
printf "\n"

printf "That's all folks!\n"

標準安裝路徑

bash的標準安裝路徑是再/bin下

若是標準輸出無效(例如non-interactive模式下)

若是從cron啓動腳本,請輸入全路徑並重定向輸出和錯誤,由於在non-interactive模式下運行的腳本遇到任何錯誤都會直接退出,若是你不考慮它的話。

啓動腳本的例子

啓動腳本是將一個服務在linux或者unix機器上啓動起來的腳本。包括系統日誌管理後臺進程、電源管理後臺進程、email和name後臺進程都是比較好的例子。這些腳本,也就是啓動進程,被編排在一個特殊的位置,例如/etc/rc.d/init.d或者/etc/init.d. 一個名叫Init的初始化進程讀取其配置文件來決定哪一個腳本是啓動仍是不起動以及在哪一個run-level啓動。run level就是一個進程的配置文件。每一個操做系統都會有但用戶操做run level用來操做管理員的命令,如將磁盤從備份中恢復過來。包括重啓和關機這樣的操做也都是有運行層級的。

啓動腳本是啓動仍是關閉的操做已經寫再腳本中了,設置啓動腳本是管理員的一個任務,可是執行這樣的任務最好是再你對啓動關閉腳本有深入理解而且可以在正確時候使用的能力的時候。建議查看init命令的man手冊而且查看inittab的相關內容

#!/bin/bash

# This script is for /etc/rc.d/init.d
# Link in rc3.d/S99audio-greeting and rc0.d/K01audio-greeting

case "$1" in
'start')
  cat /usr/share/audio/at_your_service.au > /dev/audio
  ;;
'stop')
  cat /usr/share/audio/oh_no_not_again.au > /dev/audio
  ;;
esac
exit 0

這裏出現的case語句將會在以後的隨筆中講解

相關文章
相關標籤/搜索