20天會學bash shell script(一)

pingley發表於2012-04-04
20天會學bash shell script(一)
什麼是shell script?
shell script. 就是一系列的shell 命令組成的文字檔案。該檔案時可執行的。類似於MS-DOS 下的批處理檔案。
為什麼需要shell script?
1、shell script. 可以看做是我們自己定義的命令,強大,靈活。
2、可以節省任務操作的時間,讓機器來完成瑣碎的事。
3、自動化系統日常管理巡檢任務,把減輕SA 的工作負擔,提高工作效率。
 書寫執行shell script. 前的準備工作。
1、熟悉bash shell 的常用命令。
2、熟悉或者會使用一種文字編輯工具,vi,vim....。
3、在自己的home 目錄下建立一個bin 目錄用於對shell script. 進行集中存放。
4、把該目錄新增進環境變數PATH。
[linux@zeng ~]$ mkdir bin #建立bin 目錄。
[linux@zeng ~]$ vim .bash_profile# 把該目錄寫入登入檔案中,以便每次登入的時候讀取生效。
#往該檔案中新增的內容。
PATH=$PATH:$HOME/bin
export PATH
[linux@zeng ~]$ source .bash_profile#使該檔案在當前shell 環境中生效,而不需要logout再 login.
6、明確shell 環境中執行的命令的查詢順序。
1、在命令執行前會最先進行輸入輸出流的重定向。
2、使用絕對路徑執行的命令,比如/bin/cat.
3、別名(alias)。
4、引數的擴充套件,命令的替換,算數表示式求值。
5、shell 函式。
6、內建(built in)命令.
7、hash tables.
8、PATH 變數中查詢到的第一個命令。
9、查詢失敗,返回命令沒有找到(command not found)
7、英語不會太爛。
第一個shell script。
我使用vim 編輯了一個名稱是test01.sh 的檔案。
[linux@zeng bin]$ cat test01.sh
#!/bin/bash
#
#My first shell script.
#

echo "Hello world!"
這裡有幾點需要說明。
1、使用.sh 作為shell script. 的字尾是一個好習慣。這樣可以讓你很容易知道文字的性質和內容。
2、第一行 #!/bin/bash 告訴shell 應該用什麼程式來解釋指令碼命令。
3、# 用作註解直譯器(在這裡是bash)不會解釋執行該行的內容。當程式比較龐大複雜的時候
新增註釋是一種很好的實踐,以便日後你能夠看的懂自己寫的指令碼。或者方便同事維護你的
指令碼。
4、echo  "Hello world!" 是程式的主體。這條語句的功能的列印 Hello world!。
執行指令碼。
直接使用bash sh 來執行shell script. 這樣你可以不需要給指令碼賦予可執行許可權(x).
[linux@zeng bin]$ bash test01.sh
Hello world!
[linux@zeng bin]$ sh test01.sh
Hello world!
想像執行普通的命令一樣執行指令碼。應該賦予指令碼相應的可執行許可權x.
[linux@zeng bin]$ test01.sh
-bash: /home/linux/bin/test01.sh: Permission denied
賦予所有的使用者(owner,group,other)可執行許可權x。
[linux@zeng bin]$ chmod a+x test01.sh 
[linux@zeng bin]$ test01.sh
Hello world!
上面執行shell script. 的時候都會新開一個子shell 在子shell 中執行,執行完畢後返回到父 shell。
所有對shell 環境的執行不會影響(帶回到)父 shell.如果想讓指令碼在現行shell 中執行可以使用
.(dot)或者source.(我這個指令碼不會影響shell 環境,所以無所謂在哪裡執行。這裡只是為了說明
shell script. 執行的方式的型別和區別。)
[linux@zeng bin]$ . test01.sh
Hello world!
[linux@zeng bin]$ source test01.sh
Hello world!
注:這也會剛才為什麼我可以不logout 而讓~/.bash_profile  生效的原因。
使用絕對路徑執行shell script. ,明確的告知執行的路徑。避免某些時候由於shell 命令查詢執行
順序引起的錯誤。
[linux@zeng ~]$ ~/bin/test01.sh 
Hello world!
退出狀態
怎麼知道一個命令(shell script. )執行成功沒有?可以透過查詢shell 環境變數$?。
1、返回0 表示剛才的命令已經成功執行。
2、返回非0 表示剛才的命令沒有執行成功。
[linux@zeng ~]$ echo $?
0
[linux@zeng ~]$ pw
-bash: pw: command not found
[linux@zeng ~]$ echo $?
127
我們可以再shell script. 中運用退出狀態。用來驗證shell script. 的執行情況。
[linux@zeng ~]$ cat ~/bin/test01.sh 
#!/bin/bash
#
#My first shell script.
#

echo "Hello world!"
exit 0
[linux@zeng ~]$ test01.sh
Hello world!
[linux@zeng ~]$ echo $?
0
也可以自定義退出狀態。
[linux@zeng ~]$ cat ~/bin/test01.sh 
#!/bin/bash
#
#My first shell script.
#

echo "Hello world!"
exit 10
[linux@zeng ~]$ test01.sh
Hello world!
[linux@zeng ~]$ echo $?
10
shell 中的變數
為了處理資料或者資訊,必須把他們先儲存在RAM中。RAM被分割為很多小小的可定址單元。
每一個單元透過一個唯一的記憶體地址來標識。這些記憶體單元用來儲存程式需要處理的資料。可以
透過變數名來標識記憶體地址。在shell 中有兩類變數。
1、系統變數,由linux 系統自身建立與維護。這類變數使用大寫字母定義。
2、使用者定義的變數(UDV),由使用者建立於維護。這類變數使用小寫字母定義。
需要掌握的重要的系統變數:
1、SHELL  使用的shell 型別。
[linux@zeng ~]$ echo $SHELL #使用echo 檢視某個系統變數,記得要新增dolar 符號。
/bin/bash
2、HOME 使用者登入時的主(home)目錄。
[linux@zeng ~]$ printenv HOME #使用printenv 檢視某個系統變數。
/home/linux
3、PATH  shell 命令執行時查詢的路徑。
[linux@zeng ~]$ printenv PATH
/usr/lib/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/linux/bin
4、USER 當前會話登入的使用者名稱。
[linux@zeng ~]$ printenv USER # 使用su 卻換使用者以後該值會變成新的使用者的使用者名稱。
linux
5、PS1  使用者的提示符。
[linux@zeng ~]$ echo $PS1
[\u@\h \W]\$
注:不要順便的修改系統變數,對系統變數的修改可能導致一些問題。前請先明確兩點,
為了滿足什麼而修改?怎麼修改(修改的對不對)?
變數的命令規則與使用者變數的定義
變數必須以字母或者下劃線開頭,後面可以接字元或者數字,下劃線。
使用者變數定義的語法格式:
變數名=值
對應變數的命令與變數定義同時還要注意一下幾點:
1、在shell 中變數名是區分大小寫的。也就是說var 不等於VAR。
2、使用者變數定義是“值右名左”,變數在右,值在左。
[linux@zeng ~]$ var=10
[linux@zeng ~]$ echo $var
10
[linux@zeng ~]$ 10=var
-bash: 10=var: command not found
3、給變數賦值的時候在等號的兩邊都是沒有空格的,以下變數的定義因為空格的存在出現錯誤。
[linux@zeng ~]$ var =10
-bash: var: command not found
[linux@zeng ~]$ var= 10
-bash: 10: command not found
[linux@zeng ~]$ var = 10
-bash: var: command not found
4、如果定義變數的時候不給變數賦值,變數的值是null。
[linux@zeng ~]$ var=
[linux@zeng ~]$ echo $var
5、變數值的列印使用 echo $變數名,變數的訪問使用 $變數名。
echo 與printf 
echo 命令用來列印文字資訊或者變數的值。語法格式:
echo [SHORT-OPTION]... [STRING]...
重要的選項:
-n 不換行。預設echo 是換行的。
-e使字串中的特殊(轉義或者叫逃逸)字元生效。常用跳脫字元有:
\a  警告鈴聲   \b 退一位  \c 不換行  \n 換行  \r 回行首  \t 水平Tab 
\\  表示反斜槓  \f 換頁   \v 垂直Tab鍵  \0xxx 16進製表示的ASII字元 
\xHH 8進製表示的ASII字元
[linux@zeng ~]$ echo -e "I love oracle database\nalso linux operating system."
I love oracle database
also linux  operating  system.
printf 比echo 更加的強大,主要的用途是依據給定的格式顯示引數的內容。
常用的格式化字串有:
%s 字串  %c 字元  %d  整數 %f 浮點數 %q 將特殊字元用\轉義 %b 讓跳脫字元生效。
printf 預設是不換行的,語法格式:printf FORMAT [ARGUMENT]...
[linux@zeng ~]$ printf %b "I\tlove\tlinux.\n"
I       love    linux.
注:格式化引數透過也用雙引號包起來。
[linux@zeng ~]$ printf "%b" "I\tlove\tlinux.\n"
I       love    linux.



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26110315/viewspace-720317/,如需轉載,請註明出處,否則將追究法律責任。

相關文章