Linux Bash Shell編程快速入門

來源:互聯網
上載者:User

標籤:目錄   情況   變數定義   不同   width   use   第一條   許可權   3.2   

 BASH 的基本文法
  • 最簡單的例子 —— Hello World!
  • 關於輸入、輸出和錯誤輸出
  • 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 軟體包了。

第二行的 “# 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 不處在同一個檔案系統下時將顯示出特別的優勢。

下面還幾種不常見的用法:

n<&- 表示將 n 號輸入關閉
<&- 表示關閉標準輸入(鍵盤)
n>&- 表示將 n 號輸出關閉
>&- 表示將標準輸出關閉

2.3     BASH 中對變數的規定(與 C 語言的異同)

好了下面我們進入正題,先看看 BASH 中的變數是如何定義和使用的。對於熟悉 C 語言的程式員,我們將解釋 BASH 中的定義和用法與 C 語言中有何不同。

2.3.1. BASH 中的變數介紹

我們先來從整體上把握一下 BASH 中變數的用法,然後再去分析 BASH 中變數使用與 C 語言中的不同。BASH 中的變數都是不能含有保留字,不能含有 “-” 等保留字元,也不能含有空格。

2.3.1.1 簡單變數

在 BASH 中變數定義是不需要的,沒有 “int i” 這樣的定義過程。如果想用一個變數,只要他沒有在前面被定義過,就直接可以用,當然你使用該變數的第一條語句應該是對他賦初值了,如果你不賦初值也沒關 系,只不過該變數是空( 注意:是 NULL,不是 0 )。不給變數賦初值雖然文法上不反對,但不是一個好的編程習慣。好了我們看看下面的例子:

首先用 vi 編輯下面這個檔案 hello2:

#!/bin/bash
# give the initialize value to STR
STR=”Hello World”
echo $STR

在上面這個程式中我們需要注意下面幾點:

一,變數賦值時,‘=’左右兩邊都不能有空格;
二,BASH 中的語句結尾不需要分號(”;”);
三,除了在變數賦值和在FOR迴圈語句頭中,BASH 中的變數使用必須在變數前加”$”符號,同學們可以將上面程式中第三行改為 “echo STR” 再試試,看看會出什麼結果。==>output: STR
四,由於 BASH 程式是在一個新的進程中啟動並執行,所以該程式中的變數定義和賦值不會改變其他進程或原始 Shell 中同名變數的值,也不會影響他們的運行。

更細緻的文檔甚至提到以但引號括起來的變數將不被 BASH 解釋為變數,如 ‘$STR’ ,而被看成為純粹的字串。而且更為標準的變數引用方式是 ${STR} 這樣的,$STR 自不過是對 ${STR} 的一種簡化。在複雜情況下(即有可能產生歧義的地方)最好用帶 {} 的表示方式。

BASH 中的變數既然不需要定義,也就沒有類型一說,一個變數即可以被定義為一個字串,也可以被再定義為整數。如果對該變數進行整數運算,他就被解釋為整數;如果對他進行字串操作,他就被看作為一個字串。請看下面的例子:

#!/bin/bash
x=1999
let “x = $x + 1″
echo $x
x=”olympic’”$x
echo $x

關於整數變數計算,有如下幾種:” + – * / % “,他們的意思和字面意思相同。整數運算一般通過 let 和 expr 這兩個指令來實現,如對變數 x 加 1 可以寫作:let x = $x + 1 或者 x=`expr $x + 1`

在比較操作上,整數變數和字串變數各不相同,詳見下表:

對應的操作 整數操作 字串操作
相同 -eq =
不同 -ne !=
大於 -gt >
小於 -lt <
大於或等於 -ge  
小於或等於 -le  
為空白   -z
不為空白   -n


比如:

比較字串 a 和 b 是否相等就寫作:if [ $a = $b ]
判斷字串 a 是否為空白就寫作: if [ -z $a ]
判斷整數變數 a 是否大於 b 就寫作:if [ $a -gt $b ]

更細緻的文檔推薦在字串比較時盡量不要使用 -n ,而用 ! -z 來代替。(其中符號 “!” 表示求反操作)

BASH 中的變數除了用於對 整數 和 字串 進行操作以外,另一個作用是作為檔案變數。BASH 是 Linux 作業系統的 Shell,因此系統的檔案必然是 BASH 需要操作的重要對象,如 if [ -x /root ] 可以用於判斷 /root 目錄是否可以被目前使用者進入。下表列出了 BASH 中用於判斷檔案屬性的操作符:

運算子 含義( 滿足下面要求時返回 TRUE )
-e file 檔案 file 已經存在
-f file 檔案 file 是普通檔案
-s file 檔案 file 大小不為零
-d file 檔案 file 是一個目錄
-r file 檔案 file 對目前使用者可以讀取
-w file 檔案 file 對目前使用者可以寫入
-x file 檔案 file 對目前使用者可以執行
-g file 檔案 file 的 GID 標誌被設定
-u file 檔案 file 的 UID 標誌被設定
-O file 檔案 file 是屬於目前使用者的
-G file 檔案 file 的組 ID 和目前使用者相同
file1 -nt file2 檔案 file1 比 file2 更新
file1 -ot file2 檔案 file1 比 file2 更老


注意:上表中的 file 及 file1、file2 都是指某個檔案或目錄的路徑。

2.3.1.1. 關於局部變數

在 BASH 程式中如果一個變數被使用了,那麼直到該程式的結尾,該變數都一直有效。為了使得某個變數存在於一個局部程式塊中,就引入了局部變數的概念。BASH 中,在變數首次被賦初值時加上 local 關鍵字就可以聲明一個局部變數,如下面這個例子:

#!/bin/bash
HELLO=Hello
function hello {
local HELLO=World
echo $HELLO
}
echo $HELLO
hello
echo $HELLO

該程式的執行結果是:

Hello
World
Hello

這個執行結果表明全域變數 $HELLO 的值在執行函數 hello 時並沒有被改變。也就是說局部變數 $HELLO 的影響只存在於函數那個程式塊中。

2.3.2. BASH 中的變數與 C 語言中變數的區別

這裡我們為原來不熟悉 BASH 編程,但是非常熟悉 C 語言的程式員總結一下在 BASH 環境中使用變數需要注意的問題。

1,BASH 中的變數在引用時都需要在變數前加上 “$” 符號( 第一次賦值及在For迴圈的頭部不用加 “$”符號 );
2,BASH 中沒有浮點運算,因此也就沒有浮點類型的變數可用;
3,BASH 中的整形變數的比較符號與 C 語言中完全不同,而且整形變數的算術運算也需要經過 let 或 expr 語句來處理;

2.4     BASH 中的基本流程式控制制文法

BASH 中幾乎含有 C 語言中常用的所有控制結構,如條件分支、迴圈等,下面逐一介紹。

2.4.1 if…then…else

if 語句用於判斷和分支,其文法規則和 C 語言的 if 非常相似。其幾種基本結構為:

if [ expression ]
then
statments
fi

或者

if [ expression ]
then
statments
else
statments
fi

或者

if [ expression ]
then
statments
else if [ expression ]
then
statments
else
statments
fi

或者

if [ expression ]
then
statments
elif [ expression ]
then
statments
else
statments
fi

值得說明的是如果你將 if 和 then 簡潔的寫在一行裡面,就必須在 then 前面加上分號,如:if [ expression ]; then … 。下面這個例子說明了如何使用 if 條件判斷語句:

#!/bin/bash

if [ $1 -gt 90 ]
then
echo “Good, $1″
elif [ $1 -gt 70 ]
then
echo “OK, $1″
else
echo “Bad, $1″
fi

 

 

exit 0

上面例子中的 $1 是指命令列的第一個參數,這個會在後面的“BASH 中的特殊保留字”中講解。

2.4.2 for

for 迴圈結構與 C 語言中有所不同,在 BASH 中 for 迴圈的基本結構是:

for $var in

                  • 保留變數
                  • 隨機數
                  • 運算子
                  • 變數的特殊操作
                  • BASH 中對傳回值的處理
                  • 用 BASH 設計簡單使用者介面
                  • 在 BASH 中讀取使用者輸入
                  • 一些特殊的慣用法
                  • BASH 程式的調試
                  • 關於 BASH2
                        • 中的所有項加上數字列在螢幕上等待使用者選擇,在使用者作出選擇後,變數 $var 中就包含了那個被選中的字串,然後就可以對該變數進行需要的操作了。我們可以從下面的
                      例子
                          中更直觀的來理解這個功能:

                       

                      #!/bin/bash

                      OPTIONS=”Hello Quit”
                      select opt in $OPTIONS; do
                      if [ "$opt" = "Quit" ]; then
                      echo done
                      exit
                      elif [ "$opt" = "Hello" ]; then
                      echo Hello World
                      else
                      clear
                      echo bad option
                      fi
                      done

                      exit 0

                      大家可以試著執行上面的程式,看看是什麼執行結果。

                      4.3     在 BASH 中讀取使用者輸入

                      BASH 中通過 read 函數來實現讀取使用者輸入的功能,如下面這段程式:

                      #!/bin/bash

                      echo Please enter your name
                      read NAME
                      echo “Hi! $NAME !”

                      exit 0

                      上面這個指令碼讀取使用者的輸入,並回顯在螢幕上。

                      另外 BASH 中還提供另外一種稱為 here documents 的結構????,可以將使用者需要通過鍵盤輸入的字串改為從程式體中直接讀入,如密碼。下面的小程式示範了這個功能:

                      #!/bin/bash

                      passwd=”[email protected]”
                      ftp -n localhost <<FTPFTP
                      user anonymous $passwd
                      binary
                      bye
                      FTPFTP

                      exit 0

                      這個程式在使用者需要通過鍵盤敲入一些字元時,通過程式內部的動作來類比鍵盤輸入。請注意 here documents 的基本結構為:

                      command <<SOMESPECIALSTRING
                      statments

                      SOMESPECIALSTRING

                      這裡要求在需要鍵盤輸入的命令後,直接加上 <<符號,然後跟上一個特別的字串,在該串後按順序輸入本來應該由鍵盤輸入的所有字元,在所有需要輸入的字元都結束後,重複一遍前面 <<符號後的“特別的字串”即表示該輸入到此結束。

                      4.4 一些特殊的慣用法

                      在 BASH 中 () 一對括弧一般被用於求取括弧中運算式的值或命令的執行結果,如:(a=hello; echo $a) ,其作用相當於 `…` 。

                      : 有兩個含義,一是表示空語句,有點類似於 C 語言中的單個 “;” 。表示該行是一個空命令,如果被用在 while/until 的頭結構中,則表示值 0,會使迴圈一直進行下去,如下例:

                      while :
                      do
                      operation-1
                      operation-2

                      operation-n
                      done

                      另外 : 還可以用於求取後面變數的值,比如:

                      #!/bin/bash

                      : ${HOSTNAME?} {USER?} {MAIL?}
                      echo $HOSTNAME
                      echo $USER
                      echo $MAIL

                      exit 0

                      在 BASH 中 export 命令用於將系統變數輸出到外層的 Shell 中了。

                      4.5 BASH 程式的調試

                      用 bash -x bash-script 命令,可以查看一個出錯的 BASH 指令碼到底錯在什麼地方,可以協助程式員找出指令碼中的錯誤。

                      另外用 trap 語句可以在 BASH 指令碼出錯退出時列印出一些變數的值,以供程式員檢查。trap 語句必須作為繼 “#!/bin/bash” 後的第一句非注釋代碼,一般 trap 命令被寫作: trap ‘message $checkvar1 $checkvar2′ EXIT 。

                      4.6 關於 BASH2

                      使用 bash -version 命令可以看出當前你正在使用的 BASH 是什麼版本,一般版本號碼為1.14或其他版本。而現在機器上一般還安裝了一個版本號碼為 2.0 的 BASH 。該 BASH 也在 /bin 目錄下。BASH2 提供了一些新功能,有興趣的同敘可以自己去看相關資料,或直接 man bash2 即可。


                  do
                  statments use $var
                  done

                  上面的文法結構在執行後,BASH 會將

              部分,則 day 將取遍命令列的所有參數。如這個程式:

              #!/bin/bash

              for param
              do
              echo $param
              done

              exit 0

              上面這個程式將列出所有命令列參數。for 迴圈結構的迴圈體被包含在 do/done 對中,這也是後面的 while、until 迴圈所具有的特點。

              2.4.3 while

              while 迴圈的基本結構是:

              while [ condition ]
              do
              statments
              done

              這個結構請大家自己編寫一個例子來驗證。

              2.4.4 until

              until 迴圈的基本結構是:

              until [ condition is TRUE ]
              do
              statments
              done

              這個結構也請大家自己編寫一個例子來驗證。

              2.4.5 case

              BASH 中的 case 結構與 C 語言中的 switch 語句的功能比較類似,可以用於進行多項分支控制。其基本結構是:

              case “$var” in
              condition1 )
              statments1;;
              condition2 )
              statments2;;

              * )
              default statments;;
              esac

              下面這個程式是運用 case 結構進行分支執行的例子:

              #!/bin/bash

              echo “Hit a key, then hit return.”
              read Keypress

              case “$Keypress” in
              [a-z] ) echo “Lowercase letter”;;
              [A-Z] ) echo “Uppercase letter”;;
              [0-9] ) echo “Digit”;;
              * ) echo “Punctuation, whitespace, or other”;;
              esac

              exit 0

              上面例子中的第四行 “read Keypress” 一句中的 read 語句表示從鍵盤上讀取輸入。這個命令將在本講義的 BASH 的其他進階問題中講解。

              2.4.6 break/continue

              熟悉 C 語言編程的都很熟悉 break 語句和 continue 語句。BASH 中同樣有這兩條語句,而且作用和用法也和 C 語言中相同,break 語句可以讓程式流程從當前迴圈體中完全跳出,而 continue 語句可以跳過當次迴圈的剩餘部分並直接進入下一次迴圈。

              2.5     函數的使用

              BASH 是一個相對簡單的指令碼語言,不過為了方便結構化的設計,BASH 中也提供了函數定義的功能。BASH 中的函數定義很簡單,只要向下面這樣寫就可以了:

              function my_funcname {
              code block
              }

              或者

              my_funcname() {
              code block
              }

              上面的第二種寫法更接近於 C 語言中的寫法。BASH 中要求函數的定義必須在函數使用之前,這是和 C 語言用標頭檔說明函數方法的不同。

              更進一步的問題是如何給函數傳遞參數和獲得傳回值。BASH 中函數參數的定義並不需要在函數定義處就制定,而只需要在函數被調用時用 BASH 的保留變數 $1 $2 … 來引用就可以了;BASH 的傳回值可以用 return 語句來指定返回一個特定的整數,如果沒有 return 語句顯式的返回一個傳回值,則傳回值就是該函數最後一條語句執行的結果(一般為 0,如果執行失敗返回錯誤碼)。函數的傳回值在調用該函數的程式體中通過 $? 保留字來獲得。下面我們就來看一個用函數來計算整數平方的例子:

              #!/bin/bash

              square() {
              let “res = $1 * $1″
              return $res
              }

              square $1
              result=$?
              echo $result

              exit 0


              BASH 中的特殊保留字3.1     保留變數

              BASH 中有一些保留變數,下面列出了一些:

              $IFS  這個變數中儲存了用於分割輸入參數的分割字元,預設識空格。
              $HOME  這個變數中儲存了目前使用者的根目錄路徑。
              $PATH  這個變數中儲存了當前 Shell 的預設路徑字串。
              $PS1  表示第一個系統提示符。
              $PS2  表示的二個系統提示符。
              $PWD  表示當前工作路徑。
              $EDITOR 表示系統的預設編輯器名稱。
              $BASH  表示當前 Shell 的路徑字串。
              $0, $1, $2, …
              表示系統傳給指令碼程式或指令碼程式傳給函數的第0個、第一個、第二個等參數。
              $#   表示指令碼程式的命令參數個數或函數的參數個數。
              $$   表示該指令碼程式的進程號,常用於組建檔案名唯一的臨時檔案。
              $?   表示指令碼程式或函數的返回狀態值,正常為 0,否則為非零的錯誤號碼。
              $*   表示所有的指令碼參數或函數參數。
              [email protected]   和 $* 涵義相似,但是比 $* 更安全。
              $!   表示最近一個在後台啟動並執行進程的進程號。

              3.2    隨機數

              隨機數是經常要用到的,BASH 中也提供了這個功能,請看下面這個程式:

              #!/bin/bash

              # Prints different random integer from 1 to 65536

              a=$RANDOM 
              echo $a

              exit 0

              這個程式可以在每次執行的時候隨機的列印出一個大小在 1 到 65536 之間的整數。

              3.3     運算子

              算術運算子
              + – * / % 表示加減乘除和取餘運算
              += -= *= /= 同 C 語言中的含義

              位操作符
              << <<= >> >>= 表示位左右移一位操作
              & &= | |= 表示按位與、位或操作
              ~ ! 表示非操作
              ^ ^= 表示異或操作

              關係運算子
              < > <= >= == != 表示大於、小於、大於等於、小於等於、等於、不等於操作
              && || 邏輯與、邏輯或操作

              3.4     變數的特殊操作

              BASH 中還有一些對變數的簡潔、快速的操作,大家還記得 “${var}” 和 “$var” 同樣是對變數的引用吧,對 ${var} 進行一些變化就可以產生一些新功能:
              ${var-default} 表示如果變數 $var 還沒有設定,則保持 $var 沒有設定的狀態,並返回後面的預設值 default。
              ${var=default} 表示如果變數 $var 還沒有設定,則取後面的預設值 default。
              ${var+otherwise} 表示如果變數 $var 已經設定,則返回 otherwise 的值,否則返回空( null )。
              ${var?err_msg} 表示如果變數 $var 已經設定,則返回該變數的值,否則將後面的 err_msg 輸出到標準錯誤輸出上。

              請同學們自己嘗試下面的例子:

              #!/bin/bash

              echo ${var?There is an error}

              exit 0

              還有下面一些用法,這些用法主要用於從檔案路徑字串中提取有用資訊:
              ${var#pattern}, ${var##pattern} 用於從變數 $var 中剝去最短(最長)的和 pattern 相匹配的最左側的串。
              ${var%pattern}, ${var%%pattern} 用於從變數 $var 中剝去最短(最長)的和 pattern 相匹配的最右側的串。

              另外 BASH  中還加入下面一些操作:
              ${var:pos} 表示去掉變數 $var 中前 pos 個字元。
              ${var:pos:len} 表示變數 $var 中去掉前 pos 個字元後的剩餘字串的前 len 個字元。
              ${var/pattern/replacement} 表示將變數 $var 中第一個出現的 pattern 模式替換為 replacement 字串。
              ${var//pattern/replacement} 表示將變數 $var 中出現的所有 pattern 模式全部都替換為 replacment 字串。


              BASH 中的其他進階問題4.1     BASH 中對傳回值的處理

              無論是在 Shell 中對 BASH 指令碼傳回值的處理,還是在指令碼中對函數傳回值的處理,都是通過 “$?” 系統變數來獲得。BASH 要求傳回值必須為一個整數,不能用 return 語句返回字串變數。

               

              4.2     用 BASH 設計簡單使用者介面

              BASH 中提供了一個小的語句格式,可以讓程式快速的設計出一個字元介面的使用者互動選擇的菜單,該功能就是由 select 語句來實現的,select 語句的文法為:

              select var in

          ; do 。下面是一個運用 for 進行迴圈的例子:

          #!/bin/bash

          for day in Sun Mon Tue Wed Thu Fri Sat
          do
          echo $day
          done

          # 如果列表被包含在一對雙引號中,則被認為是一個元素
          for day in “Sun Mon Tue Wed Thu Fri Sat”
          do
          echo $day
          done

          exit 0

          注意上面的例子中,在 for 所在那行的變數 day 是沒有加 “$” 符號的,而在迴圈體內,echo 所在行變數 $day 是必須加上 “$” 符號的。另外如果寫成 for day 而沒有後面的 in

      是 $var 需要遍曆的一個集合,do/done 對包含了迴圈體,相當於 C 語言中的一對大括弧。另外如果do 和 for 被寫在同一行,必須在 do 前面加上 “;”。如: for $var in


do
statments
done

其中 $var 是迴圈控制變數,

Linux Bash Shell編程快速入門

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.