成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > Linux Bash Shell入門教程

Linux Bash Shell入門教程

熱門標(biāo)簽:電話機器人客戶對話 大連遼寧電銷機器人 400電話辦理 誠薦翰諾科技 谷歌美發(fā)店地圖標(biāo)注入駐 地圖標(biāo)注路線軟件 為什么地圖標(biāo)注后不顯示 地圖標(biāo)注機位 了不起的修仙模擬器地圖標(biāo)注 好操作的電話機器人

BASH 的基本語法

  • 最簡單的例子 —— Hello World!

  • 關(guān)于輸入、輸出和錯誤輸出

  • BASH 中對變量的規(guī)定(與 C 語言的異同)

  • BASH 中的基本流程控制語法

  • 函數(shù)的使用

2.1     最簡單的例子 —— Hello World!

幾乎所有的講解編程的書給讀者的第一個例子都是 Hello World 程序,那么我們今天也就從這個例子出發(fā),來逐步了解 BASH。

用 vi 編輯器編輯一個 hello 文件如下:

#!/bin/bash
# This is a very simple example
echo Hello World

這樣最簡單的一個 BASH 程序就編寫完了。這里有幾個問題需要說明一下:

一,第一行的 #! 是什么意思
二,第一行的 /bin/bash 又是什么意思
三,第二行是注釋嗎
四,echo 語句
五,如何執(zhí)行該程序

#! 是說明 hello 這個文件的類型的,有點類似于 Windows 系統(tǒng)下用不同文件后綴來表示不同文件類型的意思(但不相同)。Linux 系統(tǒng)根據(jù) "#!" 及該字串后面的信息確定該文件的類型,關(guān)于這一問題同學(xué)們回去以后可以通過 "man magic"命令 及 /usr/share/magic 文件來了解這方面的更多內(nèi)容。在 BASH 中 第一行的 "#!" 及后面的 "/bin/bash" 就表明該文件是一個 BASH 程序,需要由 /bin 目錄下的 bash 程序來解釋執(zhí)行。BASH 這個程序一般是存放在 /bin 目錄下,如果你的 Linux 系統(tǒng)比較特別,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 后面的字符串輸出到標(biāo)準(zhǔn)輸出中去。由于 echo 后跟的是 "Hello World" 這個字符串,因此 "Hello World"這個字串就被顯示在控制臺終端的屏幕上了。需要注意的是 BASH 中的絕大多數(shù)語句結(jié)尾處都沒有分號。

如何執(zhí)行該程序呢?有兩種方法:一種是顯式制定 BASH 去執(zhí)行:

$ bash hello 或
$ sh hello (這里 sh 是指向 bash 的一個鏈接,“lrwxrwxrwx 1 root root 4 Aug 20 05:41 /bin/sh -> bash”)

或者可以先將 hello 文件改為可以執(zhí)行的文件,然后直接運行它,此時由于 hello 文件第一行的 "#! /bin/bash" 的作用,系統(tǒng)會自動用/bin/bash 程序去解釋執(zhí)行 hello 文件的:

$ chmod u+x hello
$ ./hello

此處沒有直接 “$ hello”是因為當(dāng)前目錄不是當(dāng)前用戶可執(zhí)行文件的默認(rèn)目錄,而將當(dāng)前目錄“.”設(shè)為默認(rèn)目錄是一個不安全的設(shè)置。

需要注意的是,BASH 程序被執(zhí)行后,實際上 Linux 系統(tǒng)是另外開設(shè)了一個進程來運行的。


2.2     關(guān)于輸入、輸出和錯誤輸出

在字符終端環(huán)境中,標(biāo)準(zhǔn)輸入/標(biāo)準(zhǔn)輸出的概念很好理解。輸入即指對一個應(yīng)用程序 或命令的輸入,無論是從鍵盤輸入還是從別的文件輸入;輸出即指應(yīng)用程序或命令產(chǎn)生的一些信息;與 Windows 系統(tǒng)下不同的是,Linux 系統(tǒng)下還有一個標(biāo)準(zhǔn)錯誤輸出的概念,這個概念主要是為程序調(diào)試和系統(tǒng)維護目的而設(shè)置的,錯誤輸出于標(biāo)準(zhǔn)輸出分開可以讓一些高級的錯誤信息不干擾正常的輸出 信息,從而方便一般用戶的使用。

在 Linux 系統(tǒng)中:標(biāo)準(zhǔn)輸入(stdin)默認(rèn)為鍵盤輸入;標(biāo)準(zhǔn)輸出(stdout)默認(rèn)為屏幕輸出;標(biāo)準(zhǔn)錯誤輸出(stderr)默認(rèn)也是輸出到屏幕(上面的 std 表示 standard)。在 BASH 中使用這些概念時一般將標(biāo)準(zhǔn)輸出表示為 1,將標(biāo)準(zhǔn)錯誤輸出表示為 2。下面我們舉例來說明如何使用他們,特別是標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出。

輸入、輸出及標(biāo)準(zhǔn)錯誤輸出主要用于 I/O 的重定向,就是說需要改變他們的默認(rèn)設(shè)置。先看這個例子:

$ ls > ls_result
$ ls -l >> ls_result

上面這兩個命令分別將 ls 命令的結(jié)果輸出重定向到 ls_result 文件中和追加到 ls_result 文件中,而不是輸出到屏幕上。">"就是輸出(標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出)重定向的代表符號,連續(xù)兩個 ">" 符號,即 ">>" 則表示不清除原來的而追加輸出。下面再來看一個稍微復(fù)雜的例子:

$ find /home -name lost* 2> err_result

這個命令在 ">" 符號之前多了一個 "2","2>" 表示將標(biāo)準(zhǔn)錯誤輸出重定向。由于 /home 目錄下有些目錄由于權(quán)限限制不能訪問,因此會產(chǎn)生一些標(biāo)準(zhǔn)錯誤輸出被存放在 err_result 文件中。大家可以設(shè)想一下 find /home -name lost* 2>>err_result 命令會產(chǎn)生什么結(jié)果?

如果直接執(zhí)行 find /home -name lost* > all_result ,其結(jié)果是只有標(biāo)準(zhǔn)輸出被存入 all_result 文件中,要想讓標(biāo)準(zhǔn)錯誤輸出和標(biāo)準(zhǔn)輸入一樣都被存入到文件中,那該怎么辦呢?看下面這個例子:

$ find /home -name lost* > all_result 2> 1

上面這個例子中將首先將標(biāo)準(zhǔn)錯誤輸出也重定向到標(biāo)準(zhǔn)輸出中,再將標(biāo)準(zhǔn)輸出重定向到 all_result 這個文件中。這樣我們就可以將所有的輸出都存儲到文件中了。為實現(xiàn)上述功能,還有一種簡便的寫法如下:

$ find /home -name lost* > all_result

如果那些出錯信息并不重要,下面這個命令可以讓你避開眾多無用出錯信息的干擾

$ find /home -name lost* 2> /dev/null

同學(xué)們回去后還可以再試驗一下如下幾種重定向方式,看看會出什么結(jié)果,為什么?

$ 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 不處在同一個文件系統(tǒng)下時將顯示出特別的優(yōu)勢。

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

n- 表示將 n 號輸入關(guān)閉
- 表示關(guān)閉標(biāo)準(zhǔn)輸入(鍵盤)
n>- 表示將 n 號輸出關(guān)閉
>- 表示將標(biāo)準(zhǔn)輸出關(guān)閉

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

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

2.3.1. BASH 中的變量介紹

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

2.3.1.1 簡單變量

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

首先用 vi 編輯下面這個文件 hello2

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

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

一,變量賦值時,'='左右兩邊都不能有空格;
二,BASH 中的語句結(jié)尾不需要分號(";");
三,除了在變量賦值和在FOR循環(huán)語句頭中,BASH 中的變量使用必須在變量前加"$"符號,同學(xué)們可以將上面程序中第三行改為 "echo STR" 再試試,看看會出什么結(jié)果。==>output: STR
四,由于 BASH 程序是在一個新的進程中運行的,所以該程序中的變量定義和賦值不會改變其他進程或原始 Shell 中同名變量的值,也不會影響他們的運行。

更細致的文檔甚至提到以但引號括起來的變量將不被 BASH 解釋為變量,如 '$STR' ,而被看成為純粹的字符串。而且更為標(biāo)準(zhǔn)的變量引用方式是 ${STR} 這樣的,$STR 自不過是對 ${STR} 的一種簡化。在復(fù)雜情況下(即有可能產(chǎn)生歧義的地方)最好用帶 {} 的表示方式。

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

#!/bin/bash
x=1999
let "x = $x + 1"
echo $x
x="olympic'"$x
echo $x

關(guān)于整數(shù)變量計算,有如下幾種:" + - * / % ",他們的意思和字面意思相同。整數(shù)運算一般通過 let 和 expr 這兩個指令來實現(xiàn),如對變量 x 加 1 可以寫作:let "x = $x + 1" 或者 x=`expr $x + 1`

在比較操作上,整數(shù)變量和字符串變量各不相同,詳見下表:

對應(yīng)的操作
整數(shù)操作
字符串操作
相同
-eq
=
不同
-ne
!=
大于
-gt
>
小于
-lt
大于或等于
-ge

小于或等于
-le

為空

-z
不為空

-n


比如:

比較字符串 a 和 b 是否相等就寫作:if [ $a = $b ]
判斷字符串 a 是否為空就寫作:
if [ -z $a ]
判斷整數(shù)變量 a 是否大于 b 就寫作:
if [ $a -gt $b ]

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

BASH 中的變量除了用于對 整數(shù) 和 字符串 進行操作以外,另一個作用是作為文件變量。BASH 是 Linux 操作系統(tǒng)的 Shell,因此系統(tǒng)的文件必然是 BASH 需要操作的重要對象,如 if [ -x /root ] 可以用于判斷 /root 目錄是否可以被當(dāng)前用戶進入。下表列出了 BASH 中用于判斷文件屬性的操作符:

運算符
含義( 滿足下面要求時返回 TRUE )
-e file
文件 file 已經(jīng)存在
-f file
文件 file 是普通文件
-s file
文件 file 大小不為零
-d file
文件 file 是一個目錄
-r file
文件 file 對當(dāng)前用戶可以讀取
-w file
文件 file 對當(dāng)前用戶可以寫入
-x file
文件 file 對當(dāng)前用戶可以執(zhí)行
-g file
文件 file 的 GID 標(biāo)志被設(shè)置
-u file
文件 file 的 UID 標(biāo)志被設(shè)置
-O file
文件 file 是屬于當(dāng)前用戶的
-G file
文件 file 的組 ID 和當(dāng)前用戶相同
file1 -nt file2
文件 file1 比 file2 更新
file1 -ot file2
文件 file1 比 file2 更老


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

2.3.1.1. 關(guān)于局部變量

在 BASH 程序中如果一個變量被使用了,那么直到該程序的結(jié)尾,該變量都一直有效。為了使得某個變量存在于一個局部程序塊中,就引入了局部變量的概念。BASH 中,在變量首次被賦初值時加上 local 關(guān)鍵字就可以聲明一個局部變量,如下面這個例子

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

該程序的執(zhí)行結(jié)果是:

Hello
World
Hello

這個執(zhí)行結(jié)果表明全局變量 $HELLO 的值在執(zhí)行函數(shù) hello 時并沒有被改變。也就是說局部變量 $HELLO 的影響只存在于函數(shù)那個程序塊中。

2.3.2. BASH 中的變量與 C 語言中變量的區(qū)別

這里我們?yōu)樵瓉聿皇煜?BASH 編程,但是非常熟悉 C 語言的程序員總結(jié)一下在 BASH 環(huán)境中使用變量需要注意的問題。

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

2.4     BASH 中的基本流程控制語法

BASH 中幾乎含有 C 語言中常用的所有控制結(jié)構(gòu),如條件分支、循環(huán)等,下面逐一介紹。

2.4.1 if...then...else

if 語句用于判斷和分支,其語法規(guī)則和 C 語言的 if 非常相似。其幾種基本結(jié)構(gòu)為:

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 是指命令行的第一個參數(shù),這個會在后面的“BASH 中的特殊保留字”中講解。

2.4.2 for

for 循環(huán)結(jié)構(gòu)與 C 語言中有所不同,在 BASH 中 for 循環(huán)的基本結(jié)構(gòu)是:

for $var in


do
statments
done

其中 $var 是循環(huán)控制變量,

是 $var 需要遍歷的一個集合,do/done 對包含了循環(huán)體,相當(dāng)于 C 語言中的一對大括號。另外如果do 和 for 被寫在同一行,必須在 do 前面加上 ";"。如: for $var in ; do 。下面是一個運用 for 進行循環(huán)的例子:

#!/bin/bash

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

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

exit 0

注意上面的例子中,在 for 所在那行的變量 day 是沒有加 "$" 符號的,而在循環(huán)體內(nèi),echo 所在行變量 $day 是必須加上 "$" 符號的。另外如果寫成 for day 而沒有后面的 in

部分,則 day 將取遍命令行的所有參數(shù)。如這個程序:

#!/bin/bash

for param
do
echo $param
done

exit 0

上面這個程序?qū)⒘谐鏊忻钚袇?shù)。for 循環(huán)結(jié)構(gòu)的循環(huán)體被包含在 do/done 對中,這也是后面的 while、until 循環(huán)所具有的特點。

2.4.3 while

while 循環(huán)的基本結(jié)構(gòu)是:

while [ condition ]
do
statments
done

這個結(jié)構(gòu)請大家自己編寫一個例子來驗證。

2.4.4 until

until 循環(huán)的基本結(jié)構(gòu)是:

until [ condition is TRUE ]
do
statments
done

這個結(jié)構(gòu)也請大家自己編寫一個例子來驗證。

2.4.5 case

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

case "$var" in
condition1 )
statments1;;
condition2 )
statments2;;
...
* )
default statments;;
esac

下面這個程序是運用 case 結(jié)構(gòu)進行分支執(zhí)行的例子:

#!/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 語句可以讓程序流程從當(dāng)前循環(huán)體中完全跳出,而 continue 語句可以跳過當(dāng)次循環(huán)的剩余部分并直接進入下一次循環(huán)。

2.5     函數(shù)的使用

BASH 是一個相對簡單的腳本語言,不過為了方便結(jié)構(gòu)化的設(shè)計,BASH 中也提供了函數(shù)定義的功能。BASH 中的函數(shù)定義很簡單,只要向下面這樣寫就可以了:

function my_funcname {
code block
}

或者

my_funcname() {
code block
}

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

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

#!/bin/bash

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

square $1
result=$?
echo $result

exit 0


BASH 中的特殊保留字

  • 保留變量

  • 隨機數(shù)

  • 運算符

  • 變量的特殊操作

3.1     保留變量

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

$IFS  這個變量中保存了用于分割輸入?yún)?shù)的分割字符,默認(rèn)識空格。
$HOME  這個變量中存儲了當(dāng)前用戶的根目錄路徑。
$PATH  這個變量中存儲了當(dāng)前 Shell 的默認(rèn)路徑字符串。
$PS1  表示第一個系統(tǒng)提示符。
$PS2  表示的二個系統(tǒng)提示符。
$PWD  表示當(dāng)前工作路徑。
$EDITOR 表示系統(tǒng)的默認(rèn)編輯器名稱。
$BASH  表示當(dāng)前 Shell 的路徑字符串。
$0, $1, $2, ...
表示系統(tǒng)傳給腳本程序或腳本程序傳給函數(shù)的第0個、第一個、第二個等參數(shù)。
$#   表示腳本程序的命令參數(shù)個數(shù)或函數(shù)的參數(shù)個數(shù)。
$$   表示該腳本程序的進程號,常用于生成文件名唯一的臨時文件。
$?   表示腳本程序或函數(shù)的返回狀態(tài)值,正常為 0,否則為非零的錯誤號。
$*   表示所有的腳本參數(shù)或函數(shù)參數(shù)。
$@   和 $* 涵義相似,但是比 $* 更安全。
$!   表示最近一個在后臺運行的進程的進程號。


3.2    隨機數(shù)

隨機數(shù)是經(jīng)常要用到的,BASH 中也提供了這個功能,請看下面這個程序:

#!/bin/bash

# Prints different random integer from 1 to 65536

a=$RANDOM
echo $a

exit 0

這個程序可以在每次執(zhí)行的時候隨機的打印出一個大小在 1 到 65536 之間的整數(shù)。

3.3     運算符

算術(shù)運算符
+ - * / % 表示加減乘除和取余運算
+= -= *= /= 同 C 語言中的含義

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

關(guān)系運算符
> = >= == != 表示大于、小于、大于等于、小于等于、等于、不等于操作
|| 邏輯與、邏輯或操作

3.4     變量的特殊操作

BASH 中還有一些對變量的簡潔、快速的操作,大家還記得 "${var}" 和 "$var" 同樣是對變量的引用吧,對 ${var} 進行一些變化就可以產(chǎn)生一些新功能:
${var-default} 表示如果變量 $var 還沒有設(shè)置,則保持 $var 沒有設(shè)置的狀態(tài),并返回后面的默認(rèn)值 default。
${var=default} 表示如果變量 $var 還沒有設(shè)置,則取后面的默認(rèn)值 default。
${var+otherwise} 表示如果變量 $var 已經(jīng)設(shè)置,則返回 otherwise 的值,否則返回空( null )。
${var?err_msg} 表示如果變量 $var 已經(jīng)設(shè)置,則返回該變量的值,否則將后面的 err_msg 輸出到標(biāo)準(zhǔn)錯誤輸出上。

請同學(xué)們自己嘗試下面的例子:

#!/bin/bash

echo ${var?There is an error}

exit 0

還有下面一些用法,這些用法主要用于從文件路徑字符串中提取有用信息:
${var#pattern}, ${var##pattern} 用于從變量 $var 中剝?nèi)プ疃蹋ㄗ铋L)的和 pattern 相匹配的最左側(cè)的串。
${var%pattern}, ${var%%pattern} 用于從變量 $var 中剝?nèi)プ疃蹋ㄗ铋L)的和 pattern 相匹配的最右側(cè)的串。

另外 BASH 2 中還加入下面一些操作:
${var:pos} 表示去掉變量 $var 中前 pos 個字符。
${var:pos:len} 表示變量 $var 中去掉前 pos 個字符后的剩余字符串的前 len 個字符。
${var/pattern/replacement} 表示將變量 $var 中第一個出現(xiàn)的 pattern 模式替換為 replacement 字符串。
${var//pattern/replacement} 表示將變量 $var 中出現(xiàn)的所有 pattern 模式全部都替換為 replacment 字符串。


BASH 中的其他高級問題

  • BASH 中對返回值的處理

  • 用 BASH 設(shè)計簡單用戶界面

  • 在 BASH 中讀取用戶輸入

  • 一些特殊的慣用法

  • BASH 程序的調(diào)試

  • 關(guān)于 BASH2

4.1     BASH 中對返回值的處理

無論是在 Shell 中對 BASH 腳本返回值的處理,還是在腳本中對函數(shù)返回值的處理,都是通過 "$?" 系統(tǒng)變量來獲得。BASH 要求返回值必須為一個整數(shù),不能用 return 語句返回字符串變量。


4.2     用 BASH 設(shè)計簡單用戶界面

BASH 中提供了一個小的語句格式,可以讓程序快速的設(shè)計出一個字符界面的用戶交互選擇的菜單,該功能就是由 select 語句來實現(xiàn)的,select 語句的語法為:

select var in


do
statments use $var
done

上面的語法結(jié)構(gòu)在執(zhí)行后,BASH 會將

中的所有項加上數(shù)字列在屏幕上等待用戶選擇,在用戶作出選擇后,變量 $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

大家可以試著執(zhí)行上面的程序,看看是什么執(zhí)行結(jié)果。

4.3     在 BASH 中讀取用戶輸入

BASH 中通過 read 函數(shù)來實現(xiàn)讀取用戶輸入的功能,如下面這段程序:

#!/bin/bash

echo Please enter your name
read NAME
echo "Hi! $NAME !"

exit 0

上面這個腳本讀取用戶的輸入,并回顯在屏幕上。

另外 BASH 中還提供另外一種稱為 here documents 的結(jié)構(gòu)?,可以將用戶需要通過鍵盤輸入的字符串改為從程序體中直接讀入,如密碼。下面的小程序演示了這個功能:

#!/bin/bash

passwd="aka@tsinghua"
ftp -n localhost FTPFTP
user anonymous $passwd
binary
bye
FTPFTP

exit 0

這個程序在用戶需要通過鍵盤敲入一些字符時,通過程序內(nèi)部的動作來模擬鍵盤輸入。請注意 here documents 的基本結(jié)構(gòu)為:

command SOMESPECIALSTRING
statments
...
SOMESPECIALSTRING

這里要求在需要鍵盤輸入的命令后,直接加上 符號,然后跟上一個特別的字符串,在該串后按順序輸入本來應(yīng)該由鍵盤輸入的所有字符,在所有需要輸入的字符都結(jié)束后,重復(fù)一遍前面 符號后的“特別的字符串”即表示該輸入到此結(jié)束。

4.4 一些特殊的慣用法

在 BASH 中 () 一對括號一般被用于求取括號中表達式的值或命令的執(zhí)行結(jié)果,如:(a=hello; echo $a) ,其作用相當(dāng)于 `...` 。

: 有兩個含義,一是表示空語句,有點類似于 C 語言中的單個 ";" 。表示該行是一個空命令,如果被用在 while/until 的頭結(jié)構(gòu)中,則表示值 0,會使循環(huán)一直進行下去,如下例:

while :
do
operation-1
operation-2
...
operation-n
done

另外 : 還可以用于求取后面變量的值,比如:

#!/bin/bash

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

exit 0

在 BASH 中 export 命令用于將系統(tǒng)變量輸出到外層的 Shell 中了。

4.5 BASH 程序的調(diào)試

bash -x bash-script 命令,可以查看一個出錯的 BASH 腳本到底錯在什么地方,可以幫助程序員找出腳本中的錯誤。

另外用 trap 語句可以在 BASH 腳本出錯退出時打印出一些變量的值,以供程序員檢查。trap 語句必須作為繼 "#!/bin/bash" 后的第一句非注釋代碼,一般 trap 命令被寫作: trap 'message $checkvar1 $checkvar2' EXIT 。

4.6 關(guān)于 BASH2

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

標(biāo)簽:淘寶邀評 眉山 遼陽 北海 南陽 延邊 龍巖 大興安嶺

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux Bash Shell入門教程》,本文關(guān)鍵詞  Linux,Bash,Shell,入門教程,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Linux Bash Shell入門教程》相關(guān)的同類信息!
  • 本頁收集關(guān)于Linux Bash Shell入門教程的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章

    上一篇:Linux mkdir函數(shù)mode權(quán)限設(shè)置方法

    下一篇:linux系統(tǒng)命令大全使用詳解(大全)

    欧美一级黄色带| 国产精品一区二区久久精品爱涩| yy4480电影网| 国产乱码精品一区二区三区中文| 亚洲精品福利电影| 按摩亚洲人久久| 91精品国产综合久久蜜臀| 亚洲国产天堂久久国产91| 1区2区在线观看| 亚洲精品一二三四五区| 欧洲美一区二区三区亚洲| 国产一区二区中文字幕| 亚洲欧美激情在线视频| 国产偷国产偷亚洲高清97cao| 国产精品电影网站| 亚洲成人影音| 国产一区二区三区四区五区3d| 国产字幕中文| 国产内射老熟女aaaa| 伊人中文字幕在线| 在线观看日韩一区二区| 欧美黄色成人网| 国产精品视频无码| 国产日韩免费| 四虎在线视频免费观看| 亚洲色婷婷综合开心网| 久久精品首页| 欧美一区少妇| 日韩三级影视| 在线免费看黄视频| 欧美在线观看成人| 亚洲an天堂an在线观看| 激情亚洲一区二区三区四区| 黄色在线免费观看大全| 日韩理论片在线| 日韩一区二区三区四区五区| 国产精欧美一区二区三区白种人| 亚洲精品成人电影| 欧美中文字幕在线观看| 麻豆一区在线观看| 国产一区二区三区在线免费观看| 九热爱视频精品视频| 国产精欧美一区二区三区蓝颜男同| 午夜理伦三级做爰电影| 高清不卡一二三区| 久热中文字幕在线精品免费| 无码黑人精品一区二区| 成人黄色a**站在线观看| 青青视频在线免费观看| 欧美日韩精品在线一区二区| 亚洲人成影院在线观看| 99re66热这里只有精品4| 欧美mv和日韩mv国产网站| 色综合视频一区二区三区日韩| 国产精品成人无码免费| 成人羞羞国产免费| 欧美一区二区激情视频| 国产精品一区二区不卡视频| 婷婷六月综合| 国产精品美女在线观看| 一起操在线播放| 国产美女高潮视频| 亚洲精品在线视频观看| 亚洲综合网中心| 日本精品国产| 中日韩一区二区三区| 在线欧美小视频| 91日韩中文字幕| 日本猛少妇色xxxxx免费网站| xxxxx中文字幕| 日本久久一区| 欧美精彩视频一区二区三区| 伊人久久大香线蕉成人综合网| 亚洲人午夜色婷婷| 激情视频综合网| 国产麻豆一区二区三区精品视频| 伊人成色综合网| 午夜看片在线免费| 美女av电影| 日本a级c片免费看三区| 影音先锋日韩资源| 国产探花精品一区二区| 国产精品秘入口18禁麻豆免会员| 久久中文免费视频| 秋霞欧美视频| 日韩成人免费视频| 久久精品国产99精品国产亚洲性色| 亚洲一区二区在线免费观看| 青青草视频在线观看| 狠狠色狠色综合曰曰| 99久久激情视频| 日韩免费在线观看视频| 国产麻豆入在线观看| 一区二区三区波多野结衣在线观看| 一本色道久久综合亚洲精品按摩| 无码人妻丰满熟妇区毛片蜜桃精品| 久久人人爽国产| 免费a级在线播放| 二区三区不卡不卡视频| 国产白浆在线免费观看| 老牛影视一区二区三区| 久久精品国产**网站演员| 亚洲一区二区三区欧美| 成年人免费视频播放| 亚洲美女视频网| 蜜臀av午夜一区二区三区| 一区二区三区四区高清精品免费观看| 国产在线一区二区三区欧美| 国产原创中文在线观看| 国产精品99一区二区三| 卡通动漫亚洲综合| 交videos老少配com| 美女在线视频一区| 精品人妻无码一区| 欧美色女视频| av网站在线观看不卡| 美女亚洲精品| 黄瓜视频成人app免费| 亚洲自拍小视频免费观看| 91九色美女在线视频| 欧美一二三在线| 中文字幕欧美人妻精品一区蜜臀| 天干夜夜爽爽日日日日| 亚洲欧美日韩中文播放| 日本网站在线观看一区二区三区| 九色porny丨国产精品| 精品卡一卡卡2卡3网站| 成人在线免费公开观看视频| 2018日日夜夜| 欧美—级在线免费片| 国产精品美女久久久免费| 久久久亚洲影院你懂的| 久久狠狠一本精品综合网| 欧美91看片特黄aaaa| 人人妻人人澡人人爽人人精品| 亚洲精品久久嫩草网站秘色| 日韩精品中文字幕吗一区二区| 亚洲自拍偷拍一区| av激情亚洲男人天堂| 无码人妻丰满熟妇区96| 国产精品美女久久久久久久久久久| 国产网友自拍视频导航网站在线观看| 欧美在线观看视频网站| 在线电影欧美成精品| 比比资源先锋影音网| 91麻豆精品国产91久久久久久久久| 亚洲AV无码国产精品午夜字幕| 久久嫩草精品久久久久| a级在线观看视频| 中文字幕亚洲影院| 久久久国产视频91| 精品国产乱码久久久久久牛牛| 亚洲国产专区校园欧美| 日本天码aⅴ片在线电影网站| 三上悠亚一区二区| 欧美xingq一区二区| 国产suv一区二区三区| 老鸭窝91久久精品色噜噜导演| 手机亚洲手机国产手机日韩| 男男视频亚洲欧美| 牛人国产偷窥女洗浴在线观看| 中文字幕亚洲自拍| 成人做爰免费视频免费看| 天堂在线一二区| 欧美黑人国产人伦爽爽爽| 国产精品a成v人在线播放| 欧美一区二区不卡视频| 91在线视频观看| 亚洲激情亚洲| 日本亚洲三级在线| 日韩一二三区不卡在线视频| 亚洲一区二区精品在线| 香蕉久久夜色精品国产更新时间| 欧美一区日本一区韩国一区| 日韩精品视频一区二区在线观看| 成人性视频免费看| 亚洲一级爰片777777| 蜜臀av午夜一区二区三区| 国产精品久久久久久久久久久久冷| 国产亚洲制服色| 欧美三级理伦电影| 免费麻豆国产一区二区三区四区| h在线观看视频| 亚洲v国产v欧美v久久久久久| 免费看的黄色欧美网站| 一区视频在线看| 91福利视频网站| 在线精品亚洲欧美日韩国产| 任你弄在线视频免费观看| 在线免费色视频| 肉色超薄丝袜脚交一区二区| 国产精品一区二区三区观看| 一二三四日本在线| 欧美 亚欧 日韩视频在线| 精品人妻一区二区三区四区| 成片免费观看| eeuss影院第1页在线| 欧美午夜不卡影院在线观看完整版免费| 精品国产欧美一区二区| 亚久久调教视频| 欧美精品九九久久| 九九在线观看免费视频| 亚洲成人生活片| 麻豆视频观看网址久久| 日韩人体视频一二区| 黄色大片网站在线观看| 国外成人免费在线播放| 欧美日韩中文字幕在线视频| 亚洲国产福利视频| 成人www视频在线观看| 亚洲免费视频一区二区三区| 在线免费毛片| 最近中文字幕av| 亚洲国产女人aaa毛片在线| 五月天激情开心网| 三级av免费看| 国产精品视频一区国模私拍| 一区二区三区影院| 在线观看亚洲成人| 奇米亚洲午夜久久精品| 久久精品国产综合精品| 91成人在线观看喷潮| 中文字幕久久久久| 91超碰碰碰碰久久久久久综合| 91精品国产一区二区三区香蕉| 一个人在线视频免费观看www| 天天爱天天色| av在线一区不卡| 亚洲精品ww久久久久久p站| 久久精品中文| 男人午夜天堂| 国产视频第二页| 日韩在线一区二区视频| av日韩亚洲| 欧洲成人一区二区| 一卡二卡在线观看| 夜色激情一区二区| 亚洲国产精品成人一区二区在线| 久久91精品国产91久久久| 免费成人毛片| 日韩污视频在线观看| 成人v精品蜜桃久久一区| 日本中文字幕片| 国产a级片视频| 视频亚洲一区二区| 亚洲中文字幕久久精品无码喷水| 色一情一乱一区二区三区| 亚洲电影在线免费观看| 男人揉女人奶房视频60分| 国产成人精品一区二区| 日韩动漫在线观看| 9999精品成人免费毛片在线看| 国产中文在线观看| 久久99久久99精品免观看粉嫩| 在线黄色.com| 欧美成a人片免费观看久久五月天| 精品中文字幕一区| 欧美日韩国产不卡在线看| 中文字幕久精品免费视频| 91美女片黄在线观看游戏| 亚洲AV成人无码精电影在线| 成人在线啊v| 欧美日韩中文精品| 91九色蝌蚪porny| 小黄鸭精品aⅴ导航网站入口| 91精品天堂| 欧美日韩国产综合久久| 亚洲小少妇裸体bbw| 欧美乱做爰xxxⅹ久久久| 免费成人av资源网| 91日韩免费| 蜜臀国产一区| 无码人妻一区二区三区在线视频| 久久久激情视频| 69堂亚洲精品首页| 日韩xxx高潮hd| 丰满人妻老熟妇伦人精品| 91精品尤物| 久久男人中文字幕资源站| 亚洲欧美在线播放| www.久久国产| 亚洲国产精品区| 国产精品久久久91| 日韩视频在线一区二区三区| 日本免费一区二区六区| 久久久免费电影| 久久精品国产欧美激情| 国产高清视频免费最新在线| 久久婷婷中文字幕| 亚洲一区二区三区色| 国内精品久久久久久久影视蜜臀| 精品久久久久久久久久久久久久久久久久| 玛丽玛丽电影原版免费观看1977| 三级亚洲高清视频| 午夜视频免费看| 97人妻精品一区二区三区视频| 激情图片小说一区| 精品午夜电影| 国产特级黄色片| 日韩一区二区三区在线| 奇米视频888| 日韩伦理一区二区| 精品国产乱码久久久久久虫虫漫画| 性xxxfreexxxx性欧美| 国产精品白丝jk喷水视频一区| 亚欧精品一区| 小说区图片区综合久久亚洲| 俄罗斯女人裸体性做爰| 狠狠综合久久av| 女生裸体无遮挡天堂网站免费| 欧美日韩精品一区二区天天拍小说| 一级欧美一级日韩| 欧美91精品| 国产日韩欧美中文字幕| 男同在线观看| 国产视频网站在线观看| 免费看国产一级片| 欧美成人短视频| avtt天堂资源网| 亚洲男人的天堂在线播放| 欧美视频在线观看视频| 亚洲国产成人在线视频| 成人h动漫免费观看网站| 91地址最新发布| gogogo高清免费观看在线视频| 午夜日韩在线观看| 宅男深夜免费观看视频| www.操操操|