1. 程式人生 > >Linux Bash Shell快速入門

Linux Bash Shell快速入門

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


do
statments
done

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

是 $var 需要遍歷的一個集合,do/done 對包含了迴圈體,相當於 C 語言中的一對大括號。另外如果do 和 for 被寫在同一行,必須在 do 前面加上 ";"。如: for $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

部分,則 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

這個程式可以在每次執行的時候隨機的打印出一個大小在 到 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 2 中還加入下面一些操作:
${var:pos} 表示去掉變數 $var 中前 pos 個字元。
${var:pos:len} 表示變數 $var 中去掉前 pos 個字元後的剩餘字串的前 len 個字元。
${var/pattern/replacement} 表示將變數 $var 中第一個出現的 pattern 模式替換為 replacement 字串。
${var//pattern/replacement} 表示將變數 $var 中出現的所有 pattern 模式全部都替換為 replacment 字串。

BASH 中的其他高階問題

·                                                                              BASH 中對返回值的處理

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

·                                                                              在 BASH 中讀取使用者輸入

·                                                                              一些特殊的慣用法

·                                                                              BASH 程式的除錯

·                                                                              關於 BASH2

4.1     BASH 中對返回值的處理

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

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

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

select var in


do
statments use $var
done

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

中的所有項加上數字列在螢幕上等待使用者選擇,在使用者作出選擇後,變數 $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 即可。

相關推薦

Linux Bash Shell快速入門

BASH 的基本語法 ·          最簡單的例子 —— Hello World! ·          關於輸入、輸出和錯誤輸出 ·          BASH 中對變數的規定(與 C 語言的異同) ·          BASH 中的基本流程控制語法 ·     

linux bash shell中for的用法and示例

bash shell腳本中for的用法關於linux bash shell中的for語句 在linux中shell是必不可少的一部分,但是在bash shell中有while,for,until等循環命令,今天就介紹一下關於for的一些用法。文中任何錯誤希望大佬們一一指出,不勝感激。bash sh

linux bash shell 判斷目錄是否為空的函數

http urn $1 參考 empty 判斷 details art lin #!/bin/sh ##方法一 判斷輸出字符數統計為0 is_empty_dir(){ return `ls -A $1|wc -w` } ##方法二 判斷輸出string為空 #i

linux bash Shell特殊變數:Shell $0, $#, $*, [email protected], $?

在linux下配置shell引數說明 前面已經講到,變數名只能包含數字、字母和下劃線,因為某些包含其他字元的變數有特殊含義,這樣的變數被稱為特殊變數。  例如,$ 表示當前Shell程序的ID,即pid,看下面的程式碼: [[email protected] /]$ ec

linux bash shell:最方便的字串大小寫轉換(lowercase/uppercase conversion)

關於字串大小寫轉換,是寫 linux 指令碼經常乾的事兒,所以總想找個方便的方法讓我少打點字兒,搜尋國內的中文資源,網上也能找到很多關於這個帖子,介紹的方法都差不多,用typeset是最簡單的方法了,但我覺得還是不夠簡單,因為需要多定義一個變數。 google上找到這個stackov

Linux Bash Shell學習(十二) 流程控制——select

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Shelllinux bash Shell特殊變數:Shell $0, $#, $*, [email protected]<

在linux下配置shell引數說明 前面已經講到,變數名只能包含數字、字母和下劃線,因為某些包含其他字元的變數有特殊含義,這樣的變數被稱為特殊變數。  例如,$ 表示當前Shell程序的ID,即pid,看下面的程式碼: $echo $$ 執行結果 29949

Linux Bash Shell學習(十五:變數型別和整型運算

                  本文也即《Learning the bash Shell》3rd Edition的第六章Command-Line Options and Typed varilables之讀書筆記之二,但我們將不限於此。  在之前,我們涉及的變數基本上是字串,也有整數,例如便是引數個數的$

Linux Bash Shell學習 十八 String I/O——echo和printf

                  本文也即《Learning the bash Shell》3rd Edition的第七章Input/Output and Command-Line Processing之讀書筆記之二。echo  echo是非常常用的shell命令。引數如下:-e:開啟反斜槓字元backsl

Linux Bash Shell學習 十七 I/O重定向

                  本文也即《Learning the bash Shell》3rd Edition的第七章Input/Output and Command-Line Processing之讀書筆記之一。我們曾經學習過shell的基本IO重定向操作:>、<和|。基本上能滿足95%的

Part2 Linux Bash Shell變數和重定向

直譯器 理解其他命令,並且命令執行起來 理解語句,並且根據流程控制機制讓語句按需執行: 編譯器 理解源程式,並且能夠將源程式轉換為二進位制格式,而後讓其夠執行 程式檔案:原始碼 直譯器: 由直譯器負責讀取一句執行一句 編譯器: 事先,將整個程式轉換成二進位制格式,而後執

Part2 Linux Bash Shell變量和重定向

tac 環境 ctr var interface 命令執行 空間 表示範圍 sta 解釋器 理解其他命令,並且命令執行起來 理解語句,並且根據流程控制機制讓語句按需執行: 編譯器 理解源程序,並且能夠將源程序轉換為二進制格式,而後讓其夠執行 程序文件:源代碼 解

Linux Bash Shell 載入檔案

bash shell可分為3種類型: 1 login shell:需要輸入使用者名稱和密碼才能登陸的shell 2 可互動的非login shell:不用登陸,但可以同用戶進行互動的shell,比如在父shell當中執行bash命令產生的子shell 3 不可互動的非login shell:

linux bash shell set 命令詳解

        使用set命令可以設定各種shell選項或者列出shell變數.單個選項設定常用的特性.在某些選項之後使用-o引數將特殊特性開啟.在某些選項之後使用+o引數將關閉某些特性,不帶任何引數的set命令將顯示shell的全部變數.除非遇到非法的選項,否則set總是

Linux Bash Shell字串分割substring等

近期在做持續整合專案,因為要做高使用性的平臺,公司專案組各業務線打包流程不盡相同,採用了業務藏入指令碼的方式,原有java可實現的操作寫入了指令碼中 指令碼開發中遇到的問題是:原java中的字串分割操作(substring indexOf等)不知道怎麼處理(比如/a/b

Linux Bash Shell $*和[email protected]的區別

在 Linux Bash Shell 中,$* 和 [email protected] 都表示引數列表中的所有引數,它們在具體使用中會有哪些不同呢?這裡我們可以寫一個 Shell 指令碼做實

Linux bash shell中變數的設定和使用

給變數賦值直接使用符號=,如name=kylin 使用這個變數時需要在前邊加上$符號,如echo $name, 另外,如果變數中的內容比較複雜,使用大括號是比較安全的辦法,如${name}, 如果變數所賦值中需要有空格則要加上雙引號或者單引號。 雙引號和單引號的區別在於,雙

Linux bash shell環境變數以及語法規範

賦值語句 : var=value 變數解析 : ${var} 命令解析 : ${command} 雙引號 " " : 變數內容,並做轉義 單引號 ' ' : 變數內容,但不做轉義  反單引號 ` ` : 同 $() End Of File  : "EOF" [email protected]:

01 . Linux自動化Shell詳細入門介紹及簡單應用

#### Shell簡介 > Shell 是一個 C 語言編寫的指令碼語言,它是使用者與 Linux 的橋樑,使用者輸入命令交給 Shell 解釋處理Shell 將相應的操作傳遞給核心(Kernel),核心把處理的結果輸出顯示到螢幕給使用者. ##### Shell分為兩類 `圖形介面 Shel

Linux真小白入門教程第九集——Bash Shell命令學習(6)

Linux還提供了一些命令列工具來處理大型的資料 sort命令可以對資料進行排序(預設按照回話指定的預設語言的排序規則對文字檔案中的資料行進行排序)(預設是升序) 且預設情況下,sort命令會把數字當做字元執行標準的字元排序,所以對數字進行排序時,需要使用-n引數 -M引