国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關注微信公眾號

“Linux跟我學”系列專欄(之四)——Linux Shell編程入門
2005-04-01   網絡

  在上一篇文章中,我們講述了Linux下常見命令的使用方法。在本期文章中,我們將以此為基礎,結合實例學習在Linux中進行Shell腳本編程的基礎知識。
  一期,我們將會對一些著名的Linux網站和書籍進行資源匯總,作為本系列的結束。


  從程序員的角度來看,Shell本身是一種用C語言編寫的程序;從用戶的角度來看,Shell是用戶與Linux操作系統溝通的橋梁。用戶既可以輸入命令執行,又可以利用Shell腳本編程,完成更加復雜的操作。在Linux GUI日益完善的今天,在系統管理等領域,Shell編程仍然起著不可忽視的作用。深入地了解和熟練地掌握Shell編程,是每一個Linux用戶的必修功課之一。
  Linux的Shell種類眾多,常見的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell語言的語法有所不同,所以不能交換使用。每種Shell都有其特色之處,基本上,掌握其中任何一種就足夠了。在本文中,我們關注的重點是Bash,也就是Bourne Again Shell,由于易用和免費,Bash在日常工作中被廣泛使用;同時,Bash也是大多數Linux系統默認的Shell。在一般情況下,人們并不區分Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我們可以看到#!/bin/sh,它同樣也可以改為#!/bin/bash。
  利用vi等文本編輯器編寫Shell腳本的格式是固定的,如下:

#!/bin/sh
#comments
Your commands go here

  首行中的符號#!告訴系統其后路徑所指定的程序即是解釋此腳本文件的Shell程序。如果首行沒有這句話,在執行腳本文件的時候,將會出現錯誤。后續的部分就是主程序,Shell腳本像高級語言一樣,也有變量賦值,也有控制語句。除第一行外,以#開頭的行就是注釋行,直到此行的結束。如果一行未完成,可以在行尾加上,這個符號表明下一行與此行會合并為同一行。
  編輯完畢,將腳本存盤為filename.sh,文件名后綴sh表明這是一個Bash腳本文件。執行腳本的時候,要先將腳本文件的屬性改為可執行的:

chmod +x filename.sh

  執行腳本的方法是:

./filename.sh

  下面我們從經典的“hello world”入手,看一看最簡單的Shell腳本的模樣。

#!/bin/sh
#print hello world in the console window
a = "hello world"
echo $a

  Shell Script是一種弱類型語言,使用變量的時候無需首先聲明其類型。新的變量會在本地數據區分配內存進行存儲,這個變量歸當前的Shell所有,任何子進程都不能訪問本地變量。這些變量與環境變量不同,環境變量被存儲在另一內存區,叫做用戶環境區,這塊內存中的變量可以被子進程訪問。變量賦值的方式是:

variable_name = variable_value

  如果對一個已經有值的變量賦值,新值將取代舊值。取值的時候要在變量名前加$,$variable_name可以在引號中使用,這一點和其他高級語言是明顯不同的。如果出現混淆的情況,可以使用花括號來區分,例如:

echo "Hi, $as"

  就不會輸出“Hi, hello worlds”,而是輸出“Hi,”。這是因為Shell把$as當成一個變量,而$as未被賦值,其值為空。正確的方法是:

echo "Hi, ${a}s"

  單引號中的變量不會進行變量替換操作。
  關于變量,還需要知道幾個與其相關的Linux命令。
env用于顯示用戶環境區中的變量及其取值;set用于顯示本地數據區和用戶環境區中的變量及其取值;unset用于刪除指定變量當前的取值,該值將被指定為NULL;export命令用于將本地數據區中的變量轉移到用戶環境區。
  下面我們來看一個更復雜的例子,結合這個例子,我們來講述Shell Script的語法。

1 #!/bin/bash
2 # we have less than 3 arguments. Print the help text:
3 if [ $# -lt 3 ] ; then
4 cat <5 ren -- renames a number of files using sed regular expressions
6
7 USAGE: ren regexp replacement files...
8 EXAMPLE: rename all *.HTM files in *.html:
9  ren HTM$ html *.HTM
10
11 HELP
12  exit 0
13 fi
14 OLD="$1"
15 NEW="$2"
16 # The shift command removes one argument from the list of
17 # command line arguments.
18 shift
19 shift
20 # $* contains now all the files:
21 for file in $*; do
22 if [ -f "$file" ] ; then
23    newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`
24    if [ -f "$newfile" ]; then
25     echo "ERROR: $newfile exists already"
26    else
27     echo "renaming $file to $newfile ..."
28     mv "$file" "$newfile"
29    fi
30 fi
31 done

  我們從頭來看,前面兩行上一個例子中已經解釋過了,從第三行開始,有新的內容。if語句和其他編程語言相似,都是流程控制語句。它的語法是:

if …; then

elif …; then

else

fi

  與其他語言不同,Shell Script中if語句的條件部分要以分號來分隔。第三行中的[]表示條件測試,常用的條件測試有下面幾種:

[ -f "$file" ] 判斷$file是否是一個文件
[ $a -lt 3 ] 判斷$a的值是否小于3,同樣-gt和-le分別表示大于或小于等于
[ -x "$file" ] 判斷$file是否存在且有可執行權限,同樣-r測試文件可讀性
[ -n "$a" ] 判斷變量$a是否有值,測試空串用-z
[ "$a" = "$b" ] 判斷$a和$b的取值是否相等
[ cond1 -a cond2 ] 判斷cond1和cond2是否同時成立,-o表示cond1和cond2有一成立

  要注意條件測試部分中的空格。在方括號的兩側都有空格,在-f、-lt、=等符號兩側同樣也有空格。如果沒有這些空格,Shell解釋腳本的時候就會出錯。
  $#表示包括$0在內的命令行參數的個數。在Shell中,腳本名稱本身是$0,剩下的依次是$0、$1、$2…、${10}、${11},等等。$*表示整個參數列表,不包括$0,也就是說不包括文件名的參數列表。
現在我們明白第三行的含義是如果腳本文件的參數少于三個,則執行if和fi語句之間的內容。然后,從第四行到第十一行之間的內容在Shell Script編程中被稱為Here文檔,Here文檔用于將多行文本傳遞給某一命令。Here文檔的格式是以<<開始,后跟一個字符串,在Here文檔結束的時候,這個字符串同樣也要出現,表示文檔結束。在本例中,Here文檔被輸出給cat命令,也即將文檔內容打印在屏幕上,起到顯示幫助信息的作用。
  第十二行的exit是Linux的命令,表示退出當前進程。在Shell腳本中可以使用所有的Linux命令,利用上面的cat和exit,從一方面來說,熟練使用Linux命令也可以大大減少Shell腳本的長度。
  十四、十五兩句是賦值語句,分別將第一和第二參數賦值給變量OLD和NEW。緊接下來的兩句是注釋,注釋下面的兩條shift的作用是將參數列表中的第一個和第二個參數刪除,后面的參數依次變為新的第一和第二參數,注意參數列表原本也不包括$0。
  然后,自二十一行到三十一行是一個循環語句。Shell Script中的循環有下面幾種格式:

while [ cond1 ] && { || } [ cond2 ] …; do

done
for var in …; do

done
for (( cond1; cond2; cond3 )) do

done
until [ cond1 ] && { || } [ cond2 ] …; do

done

  在上面這些循環中,也可以使用類似C語言中的break和continue語句中斷當前的循環操作。第二十一行的循環是將參數列表中的參數一個一個地放入變量file中。然后進入循環,判斷file是否為一個文件,如果是文件的話,則用sed命令搜索和生成新的文件名。sed基本上可以看成一個查找替換程序,從標準輸入,例如管道讀入文本,并將結果輸出到標準輸出,sed使用正則表達式進行搜索。在第二十三行中,backtick(`)的作用是取出兩個backtick之間的命令輸出結果,在這里,也就是將結果取出賦給變量newfile。此后,判斷newfile是否已經存在,否則就把file改成newfile。這樣我們就明白這個腳本的作用了,Shell Script編寫的其他腳本與此相似,只不過是語法和用法稍有不同而已。
  通過這個例子我們明白了Shell Script的編寫規則,但還有幾件事情需要講述一下。
  第一個,除了if語句之外,Shell Script中也有類似C語言中多分支結構的case語句,它的語法是:

case var in
pattern 1 )
… ;;
pattern 2 )
… ;;
*)
… ;;
esac

  我們再就下面一個例子,看看case語句的用法。

while getopts vc:OPTION
do
case $OPTION
in
c) COPIES = $OPTARG;;
v) …;;
?) exit 1;;
esac
done

  上面的getopts類似于C語言提供的函數getopts,在Shell Script中,getopts經常和while語句聯合起來使用。getopts的語法如下:

getopts option_string variable

  option_string中包含一串單字符選項,若getopts在命令行參數中發現了連字符,那么它會將連字符之后的字符與option_string進行比較,若匹配成功,則把變量variable的值設為該選項,若無匹配,則把變量的值設為?。有時候,選項還會帶一個值,例如-c5等,這時要在option_string中該選項字母后面加上一個冒號,getopts發現冒號后,會讀取該值,然后將該值放入特殊變量OPTARG中。這個命令比較復雜,如有需要,讀者可以詳細參閱Shell編寫的相關資料。
  上面這個循環的作用就是依次取出腳本名稱后面的選項,進行處理,如果輸入了非法選項,則進入?指定的部分,退出腳本程序。
  第二個,Bash提供了一種用于交互式應用的擴展select,用戶可以從一組不同的值中進行選擇。其語法如下:

select var in …; do
break;
done

  例如,下面這段程序的輸出是:

#!/bin/bash
echo "Your choice?"
select var in "a" "b" "c"; do
break
done
echo $var
----------------------------
Your choice?
1) a
2) b
3) c

  第三,Shell Script中也可以使用自定義的函數,其語法形式如下:

functionname()
{

}

  例如我們可以把上面第二個例子中第四到第十二行放入一個名為help函數體內,以后每次調用的時候直接寫help即可。函數中處理函數調用參數的方法是,直接用上面講過的$1、$2來分別表示第一、第二個參數,用$*表示參數列表。
  第四,我們也可以在Shell下調試Shell Script腳本,當然最簡單的方法就是用echo輸出查看變量取值了。Bash也提供了真正的調試方法,就是執行腳本的時候用-x參數。

sh x filename.sh

  這會執行腳本并顯示腳本中所有變量的取值,也可以使用參數-n,它并不執行腳本,只是返回所有的語法錯誤。

熱詞搜索:

上一篇:《Linux安裝入門》的幾點補充
下一篇:從TRUNK說開去

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
色噜噜狠狠色综合欧洲selulu| 老色鬼精品视频在线观看播放| 午夜电影久久久| 欧美日韩一区在线观看| 日韩制服丝袜av| 精品国产乱码久久| 成a人片亚洲日本久久| 亚洲精品国产高清久久伦理二区| 91成人在线免费观看| 蜜臀a∨国产成人精品| 国产日韩一级二级三级| 在线这里只有精品| 激情久久五月天| 亚洲欧美电影院| 色噜噜夜夜夜综合网| 亚洲男人的天堂网| 日韩欧美一区二区久久婷婷| 国产精品一品二品| 五月激情丁香一区二区三区| 日本一区二区在线不卡| 日本乱人伦一区| 国产精品一区二区久久不卡| 婷婷亚洲久悠悠色悠在线播放| 国产午夜亚洲精品理论片色戒| 日本精品视频一区二区| 国产精品亚洲成人| 亚洲第一久久影院| 国产情人综合久久777777| 在线视频欧美精品| 国产精品自在在线| 一区二区三区在线观看视频| 欧美成人bangbros| 欧美中文字幕一区二区三区| 国产一区91精品张津瑜| 亚洲成人激情av| 欧美激情一区三区| 欧美亚洲免费在线一区| 国产成人av资源| 日韩国产欧美三级| 国产精品无圣光一区二区| 欧美日韩一区二区在线视频| 不卡的av电影在线观看| 免费在线看一区| 亚洲欧美日韩在线| 国产视频一区在线播放| 欧美精品欧美精品系列| 成人激情动漫在线观看| 午夜精品福利一区二区蜜股av| 国产视频亚洲色图| 日韩视频不卡中文| 91理论电影在线观看| 成人美女视频在线看| 日韩高清在线观看| 亚洲一区二区三区三| 日本一区二区三区电影| 久久久夜色精品亚洲| 欧美一区永久视频免费观看| 欧美亚洲一区二区在线| 成人动漫中文字幕| 91麻豆.com| 在线这里只有精品| 欧美四级电影在线观看| 3d动漫精品啪啪| 欧美人与z0zoxxxx视频| 日本高清不卡一区| 欧美日韩国产成人在线91 | 久久久久久日产精品| 欧美丝袜丝交足nylons| 欧美欧美欧美欧美| 国产乱码精品一区二区三| 日韩av一级片| 麻豆精品蜜桃视频网站| 久久成人免费网| 精品一区二区三区在线播放视频 | 狠狠色综合日日| 免费成人在线观看| 精品久久人人做人人爽| 中文字幕免费不卡| 亚洲国产中文字幕在线视频综合| 日韩和欧美的一区| 成人av在线一区二区| 欧美在线视频你懂得| 日韩一区二区高清| 国产精品传媒视频| 亚洲va天堂va国产va久| 日本美女视频一区二区| 日本不卡高清视频| 秋霞av亚洲一区二区三| 白白色 亚洲乱淫| 日韩一级大片在线观看| 国产精品卡一卡二卡三| 亚洲精品中文在线影院| 蜜臀久久久久久久| 91麻豆精东视频| 日韩欧美一区二区视频| 综合久久综合久久| 开心九九激情九九欧美日韩精美视频电影| 久久99国产精品成人| 成人美女视频在线观看18| 欧美日韩一卡二卡| 国产精品日韩精品欧美在线| 一区二区三区日韩精品视频| 午夜精品一区二区三区免费视频| 久久99精品国产麻豆婷婷| 在线观看一区二区视频| 精品国产乱码久久久久久夜甘婷婷 | 欧美aa在线视频| 97精品久久久午夜一区二区三区 | 日本人妖一区二区| 色视频欧美一区二区三区| 欧美色涩在线第一页| 国产精品美女久久久久久久久久久 | 欧美激情一区二区三区不卡 | av在线播放成人| 欧美一区二区播放| 一区二区三区欧美视频| 国产麻豆视频精品| 日韩欧美视频在线| 综合中文字幕亚洲| 国产1区2区3区精品美女| 91精品欧美一区二区三区综合在 | 久久久久久免费| 一区二区三区四区蜜桃| 成人免费视频一区二区| 日韩欧美黄色影院| 欧美这里有精品| 在线播放/欧美激情| 亚洲美女视频在线观看| 一区二区三区免费在线观看| 国产一区欧美一区| 日韩国产精品久久| 亚洲精品免费看| 亚洲 欧美综合在线网络| 国产精品超碰97尤物18| 国产婷婷色一区二区三区在线| 91精品国产一区二区| 99久久国产免费看| 在线观看区一区二| 国产在线一区观看| 成人午夜视频网站| 色综合中文字幕| 欧美日本一区二区| 欧美成人女星排行榜| 欧美性生活影院| 欧美日本乱大交xxxxx| 国产精品国产精品国产专区不片| 欧美成人vr18sexvr| 久久久久亚洲蜜桃| 亚洲免费在线播放| 亚洲一区在线观看免费| 日本一区中文字幕| 成人av资源网站| 欧美美女bb生活片| ww亚洲ww在线观看国产| 国产免费久久精品| 亚洲444eee在线观看| 福利一区在线观看| 美女视频一区二区| 欧美日韩国产综合久久| 久久久激情视频| 精品综合免费视频观看| 91超碰这里只有精品国产| 中文字幕在线免费不卡| 日韩欧美的一区二区| 欧美美女喷水视频| 欧美r级电影在线观看| 国产精品人妖ts系列视频| 不卡的电视剧免费网站有什么| 国内外精品视频| 国产在线一区二区| 亚洲乱码日产精品bd| 在线观看三级视频欧美| 视频在线在亚洲| 日本一二三不卡| 91麻豆精品国产| 91日韩精品一区| 国产精品996| 人人狠狠综合久久亚洲| 亚洲视频免费看| 国产午夜一区二区三区| 欧美精品一级二级| 97se亚洲国产综合在线| 狠狠色综合播放一区二区| 亚洲高清免费视频| 《视频一区视频二区| 久久精品综合网| 欧美videofree性高清杂交| 欧美在线不卡一区| 97久久超碰国产精品电影| 国产一区二区视频在线| 日韩国产精品91| 亚洲成人黄色影院| 亚洲精品国产视频| 亚洲乱码国产乱码精品精可以看| 久久久久国产精品麻豆| 欧美一区二区视频网站| 欧美美女视频在线观看| 欧美日韩精品一区二区天天拍小说| 色狠狠色狠狠综合| 在线免费不卡视频|