《shell腳本學習指南》學習筆記之入門


為什么要使用shell腳本?

shell腳本能夠輕易處理文件與目錄之類的對象,而且是各UNIX系統之間經過POSIX標准化的通用的功能,因此Shell腳本只要“用心寫”一次,即可應用到很多系統上,因此之所以要使用Shell腳本是基於:

  • 簡單性:Shell是一個高級語言,通過它,你可以簡潔地表達發雜的操作;
  • 可移植性:使用POSIX所定義的功能,可以做到腳本無須修改就可以在不同的系統上執行;
  • 開發容易:可以在短時間內完成一個功能強大又好用的腳本;

第一個shell腳本

cat > testshell                    建立文件,使用cat復制終端輸入
who | wc -l		           程序內容
^D			           Ctrl-D表示end-of-file
$ chmod +x testshell 	           讓文件擁有執行權限
$ ./testshell		           執行測試

當Shell執行一個程序時,會要求UNIX內核啟動一個新的進程(process),以便在該進程里執行所制定的程序。當Shell要求內核執行它時,內核無法做這件事,因為它不是編譯型程序,於是回應“not executable format file”(不是可執行的格式文件)錯誤信息。Shell收到此錯誤信息時,就會認為“既然不是編譯型程序,那就一定是Shell腳本”,於是會啟動一個新的/bin/sh(標准Shell)副本來執行該程序。

如上述當系統只有一個Shell(/bin/sh)時還行,但現行的UNIX系統都會擁有好幾個Shell,那么我們就需要一種方式來告訴UNIX內核該啟用那個Shell來執行,這種方式就是:在第一行的開頭除使用#!這兩個字符,其后跟Shell的具體路徑。如:

#! /bin/sh
who | wc -l

#!后的Shell還可以被傳參數。

Shell識別三種基本命令:內建命令、Shell函數以及外部命令:

  1. 內建命令就是由Shell本身所執行的命令。
    • 有些命令是由於其必要性才內建的,例如cd用來改變目錄、read會將來自用戶(或文件)的輸入數據傳給Shell變量;
    • 另一種內建命令存在則是為了效率,其中最典型的就是test命令,編寫腳本時經常用到它;
    • 還有I/O命令,如echo和printf;
  2. Shell函數是功能健全的一些程序代碼,以Shell語言寫成,他們可以像命令那樣引用。
  3. 外部命令就是由Shell的副本(新的進程)所執行的命令,基本過程如下:
    • 建立一個新的進程,此進程即為Shell的一個副本;
    • 在新的進程里,在PATH變量內所列出的目錄中,尋找特定的命令。/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin為PATH變量典型的默認值。當命令名稱含有斜杠(/)符號時,將略過路徑查找步驟;
    • 在新的進程里,以所找到的新程序取代執行中的Shell程序並執行;
    • 程序完成后,最初的Shell會接着從終端讀取下一條命令,或執行腳本里的下一條命令,如下圖

變量

Shell變量名稱的開頭是一個字母或下划線符號,后面可以接字母、數字或下划線符號。變量賦值:

變量名=變量值

=號左右沒有空格,當使用變量時,只需要在變量名前加上”$“符號.如:

#! /bin/sh
website=oseye.net
echo $website

#單行可以進行多次賦值
name=kevin age=22 sex=f
#值中包含空格時使用引號
address="guandong china"
#變量賦給別的變量
address2=$address
#當幾個變量組合賦給變量可以使用雙引號
info="$name $age $address"

echo $info

printf

由於echo有版本上的差異,會導致在UNIX版本間很難移植,因此我們一般使用最簡單的echo形式,而我們常用的是prinf命令,它別echo更靈活和強大。printf命令模仿C程序庫里的printf,它幾乎復制了該函數的所有功能,可也查看man手冊。

I/O重定向

標准輸入/輸出是軟件設計原則里非常重要的概念:程序應該有數據的來源端、數據的目的端以及報告問題的地方,他們粉筆被稱為標准輸入(standard input)、標准輸出(standard output)以及標准錯誤輸出(standard error).

Shell提供了數種語法標記,可用來改變默認I/O的來源端和目的端,如<改變標准輸入、>改變標准輸出、>>附加到文件、|建立管道。

特殊文件:/dev/null和/dev/tty
這是UNIX系統提供了兩個對Shell編程特別有用的兩個特殊文件:

  • /dev/null是大家所熟知的位桶(bit bucket),傳送到此文件的數據會被操作系統丟掉,相對地,讀取它則會立即返回文件結束符號。
  • /dev/tty是當前進程的控制終端文件,當程序打開此文件時,UNIX會自動將它重定向到一個終端,在程序必須讀取人工輸入時特別有用,用它產生錯誤信息也很不錯,只是很少有人這樣用。

命令查找:也是在$PATH路徑中查找,但Linux的PATH與Windows的PATH不同是用“:”分隔,而不是“;”,可與修改.profile來永久生效PATH.
腳本參數:可與在執行腳本的時候對它傳參,各參數都是通過整數來命名,基於歷史的原因,當它超過9個就要大括號把數字括起來,如:

#! /bin/sh
echo $1
echo ${10}

執行跟蹤

為了調試Shell可打開跟蹤(execution tracing)功能,有兩種方式:向sh傳遞參數和shell通過set來設置。

sh -x testshell #可與通過man sh查看sh的參數幫助
#! /bin/sh
set -x	#打開跟蹤功能
echo a
echo b
set +x	#關閉跟蹤功能
echo c


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM