BASH 的基本文法
•最簡單的例子 —— Hello World www.111cn.net !
•關於輸入、輸出和錯誤輸出
•BASH 中對變數的規定(與 C 語言的異同)
•BASH 中的基本流程式控制制文法
•函數的使用
2.1 最簡單的例子 —— Hello World!
幾乎所有的講解編程的書給讀者的第一個例子都是 Hello World 程式,那麼我們今天也就從這個例子出發,來逐步瞭解 BASH。
用 vi 編輯器編輯一個 hello 檔案如下:
#!/bin/bash
# This is a very simple example
echo Hello World
這樣最簡單的一個 BASH 程式就編寫完了。這裡有幾個問題需要說明一下:
一,第一行的 #! 是什麼意思
二,第一行的 /bin/bash 又是什麼意思
三,第二行是注釋嗎
四,echo 語句
五,如何執行該程式
#! 是說明 hello 這個檔案的類型的,有點類似於 Windows 系統下用不同檔案尾碼來表示不同檔案類型的意思(但不相同)。Linux 系統根據 "#!" 及該字串後面的資訊確定該檔案的類型,關於這一問題同學們回去以後可以通過 "man magic"命令 及 /usr/share/magic 檔案來瞭解這方面的更多內容。在 BASH 中 第一行的 "#!" 及後面的 "/bin/bash" 就表明該檔案是一個 BASH 程式,需要由 /bin 目錄下的 bash 程式來解釋執行。BASH 這個程式一般是存放在 /bin 目錄下,如果你的 Linux 系統比較特別,bash 也有可能被存放在 /sbin 、/usr/local/bin 、/usr/bin 、/usr/sbin 或 /usr/local/sbin 這樣的目錄下;如果還找不到,你可以用 "locate bash" "find / -name bash 2> /dev/null" 或 "whereis bash" 這三個命令找出 bash 所在的位置;如果仍然找不到,那你可能需要自己動手安裝一個 BASH 軟體包了。
第二行的 www.111cn.net "# This is a ..." 就是 BASH 程式的注釋,在 BASH 程式中從“#”號(注意:後面緊接著是“!”號的除外)開始到行尾的多有部分均被看作是程式的注釋。的三行的 echo 語句的功能是把 echo 後面的字串輸出到標準輸出中去。由於 echo 後跟的是 "Hello World" 這個字串,因此 "Hello World"這個字串就被顯示在控制台終端的螢幕上了。需要注意的是 BASH 中的絕大多數語句結尾處都沒有分號。
如何執行該程式呢?有兩種方法:一種是顯式制定 BASH 去執行:
$ bash hello 或
$ sh hello (這裡 sh 是指向 bash 的一個連結,“lrwxrwxrwx 1 root root 4 Aug 20 05:41 /bin/sh -> bash”)
或者可以先將 hello 檔案改為可以執行的檔案,然後直接運行它,此時由於 hello 檔案第一行的 "#! /bin/bash" 的作用,系統會自動用/bin/bash 程式去解釋執行 hello 檔案的:
$ chmod u+x hello
$ ./hello
此處沒有直接 “$ hello”是因為目前的目錄不是目前使用者可執行檔的預設目錄,而將目前的目錄“.”設為預設目錄是一個不安全的設定。
需要注意的是,BASH 程式被執行後,實際上 Linux 系統是另外開設了一個進程來啟動並執行。
2.2 關於輸入、輸出和錯誤輸出
在字元終端環境中,標準輸入/標準輸出的概念很好理解。輸入即指對一個應用程式 或命令的輸入,無論是從鍵盤輸入還是從別的檔案輸入;輸出即指應用程式或命令產生的一些資訊;與 Windows 系統下不同的是,Linux 系統下還有一個標準錯誤輸出的概念,這個概念主要是為程式調試和系統維護目的而設定的,錯誤輸出於標準輸出分開可以讓一些進階的錯誤資訊不干擾正常的輸出 資訊,從而方便一般使用者的使用。
在 Linux 系統中:標準輸入(stdin)預設為鍵盤輸入;標準輸出(stdout)預設為螢幕輸出;標準錯誤輸出(stderr)預設也是輸出到螢幕(上面的 std 表示 standard)。在 BASH 中使用這些概念時一般將標準輸出表示為 1,將標準錯誤輸出表示為 2。下面我們舉例來說明如何使用他們,特別是標準輸出和標準錯誤輸出。
輸入、輸出及標準錯誤輸出主要用於 I/O 的重新導向,就是說需要改變他們的預設設定。先看這個例子:
$ ls > ls_result
$ ls -l >> ls_result
上面這兩個命令分別將 ls 命令的結果輸出重新導向到 ls_result 檔案中和追加到 ls_result 檔案中,而不是輸出到螢幕上。">"就是輸出(標準輸出和標準錯誤輸出)重新導向的代表符號,連續兩個 ">" 符號,即 ">>" 則表示不清除原來的而追加輸出。下面再來看一個稍微複雜的例子:
$ find /home -name lost* 2> err_result
這個命令在 ">" 符號之前多了一個 "2","2>" 表示將標準錯誤輸出重新導向。由於 /home 目錄下有些目錄由於許可權限制不能訪問,因此會產生一些標準錯誤輸出被存放在 err_result 檔案中。大家可以設想一下 find /home -name lost* 2>>err_result 命令會產生什麼結果?
如果直接執行 find /home -name lost* > all_result ,其結果是只有標準輸出被存入 all_result 檔案中,要想讓標準錯誤輸出和標準輸入一樣都被存入到檔案中,那該怎麼辦呢?看下面這個例子:
$ find /home -name lost* > all_result 2>& 1
上面這個例子中將首先將標準錯誤輸出也重新導向到標準輸出中,再將標準輸出重新導向到 all_result 這個檔案中。這樣我們就可以將所有的輸出都儲存到檔案中了。為實現上述功能,還有一種簡便的寫法如下:
$ find /home -name lost* >& all_result
如果那些出錯資訊並不重要,下面這個命令可以讓你避開眾多無用出錯資訊的幹擾:
$ find /home -name lost* 2> /dev/null
同學們回去後還可以再實驗一下如下幾種重新導向方式,看看會出什麼結果,為什嗎?
$ find /home -name lost* > all_result 1>& 2
$ find /home -name lost* 2> all_result 1>& 2
$ find /home -name lost* 2>& 1 > all_result
另外一個非常有用的重新導向操作符是 "-",請看下面這個例子:
$ (cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xvfp -)
該命令表示把 /source/directory 目錄下的所有檔案通過壓縮和解壓,快速的全部移動到 /dest/directory 目錄下去,這個命令在 /source/directory 和 /dest/directory 不處在同一個檔案系統下時將顯示出特別的優勢。
條件陳述式(注意:條件裡兩邊的空格,引號,等號)
if [ "$var" = "abc" ]; then
…
elif [ "$var" = "ac" ]; then
…
else
…
fi
for迴圈
for var in $(ls *.sh); do
echo $var
done
while迴圈
var=1
while [ "$var" -le 20 ] ; do
var=$(($var+1))
done
until迴圈(跟while迴圈相反的)
until condition
do
…
done
case條件(可用正則,;;相當於break)
case “$var” in
yes | YES | y )
echo “YES”
echo “haha”
;;
[Nn]* ) echo “NO”;;
* ) echo “OTHER”;;
esac
定義/賦值變數
var=xxx (等號兩邊不能有空格)
變數讀取
echo $var
讀取使用者輸入
read var
不輸出換行
echo -n
執行命令並捕獲傳回值
$(command)
其它
shell裡預設類型是字串型
發布在編程演算法 已有標籤 bash, shell. 將該連結存入書籤。 Trackbacks are closed, but you can post a comment.