Shell編程

在Linux系統(tǒng)中,Shell是一個非常靈活的工具。Shell不僅能夠執(zhí)行命令,而且是一門非常優(yōu)秀的編程語言贮乳。

一、Shell編程基礎(chǔ)

通過使用Shell編程可以使大量的任務(wù)自動化恬惯,Shell程序特別擅長系統(tǒng)管理任務(wù)向拆,尤其適合那些易用性、可維護性和便攜性比效率更重要的任務(wù)酪耳。

1浓恳、Shell腳本概述

Shell腳本程序是Shell命令語句的集合(內(nèi)部命令和外部命令),用于實現(xiàn)特定的功能葡兑,Shell腳本程序保存在文本文件中奖蔓,可以使用文本處理程序閱讀和編輯(例如gedit或vi/vim)赞草。
Linux系統(tǒng)中的Shell腳本通常具備以下特點:

  • Shell腳本程序是由Shell環(huán)境解釋執(zhí)行的讹堤;
  • Shell腳本不需要編譯、鏈接及生成可執(zhí)行文件厨疙,直接由相應(yīng)的解釋器解釋執(zhí)行即可洲守;
  • 執(zhí)行Shell程序時,Shell腳本文件需要具有可執(zhí)行的權(quán)限沾凄;
  • Shell腳本可以使用變量梗醇、控制語句等比較復(fù)雜的結(jié)構(gòu);
  • Shell腳本是從上而下撒蟀、順序執(zhí)行的叙谨。

2、創(chuàng)建Shell腳本

直接使用文本編輯程序vim即可創(chuàng)建和編寫Shell腳本程序手负。

  xuqing@master: ~ $ vim hello.sh                    #創(chuàng)建Shell腳本
  xuqing@master: ~ $ chmod u+x hello.sh              #賦予其可執(zhí)行權(quán)利
  xuqing@master: ~ $ ./hello.sh                      #執(zhí)行腳本

也可以執(zhí)行以下命令,兩者是等價的姑尺。

  xuqing@master: ~ $ vim hello.sh                    #創(chuàng)建Shell腳本
  xuqing@master: ~ $ bash hello.sh                   #利用bash命令直接解釋執(zhí)行腳本

Shell腳本同Linux系統(tǒng)中的其他文件一樣,可以不使用擴展名统捶。但是為了方便識別喘鸟,通常建議Bash腳本文件名以sh結(jié)尾迷守,Tcsh腳本文件以csh結(jié)尾凯力。

  #!/bin/bash
  #This is a test script
  #This script will output hello

   echo "hello!"

   exit 0
  • `#!/bin/bash咐鹤,文件第一行的內(nèi)容是告訴系統(tǒng)使用哪種Shell來解釋執(zhí)行此腳本中的肉容,本例中使用的是Bash圣絮。
  • `#This is a test script祈惶,腳本注釋行。
  • echo "hello!" 扮匠,命令行捧请。
  • exit 0,該命令用來結(jié)束腳本棒搜,該命令也會返回一個值來傳遞給父進程疹蛉,一般情況下,成功則返回0力麸,非0表示一個錯誤碼可款。

3、Shell編程語法

Shell程序本質(zhì)上也是一種結(jié)構(gòu)化程序克蚂,掌握Shell編程的基礎(chǔ)就是熟練使用其編程語法闺鲸。Shell編程語法主要包括變量、函數(shù)埃叭、控制結(jié)構(gòu)摸恍,以及相關(guān)的Shell命令等。

3.1 變量

在Shell里赤屋,變量具有以下特點:

  • 在使用變量之前并不需要聲明立镶,而是通過使用(賦值=左右沒有空格)變量來創(chuàng)建;
  • 在默認情況下益缎,所有的變量都是作為字符串進行存儲谜慌;
  • 變量名區(qū)分大小寫
  • 通過在變量名前面加一個$符號來訪問它的內(nèi)容莺奔;
3.2 echo命令

echo命令其作用是顯示一行文本欣范。其常用的語法格式如下:
echo [option] [string]

  • -n”变泄,指示echo命令不輸出行尾的換行符;
3.2.1 set命令

set命令作用主要是顯示系統(tǒng)中已經(jīng)存在的shell變量恼琼,以及設(shè)置shell變量的新變量值妨蛹。使用set更改shell特性時,符號"+"和"-"的作用分別是打開和關(guān)閉指定的模式晴竞。set命令不能夠定義新的shell變量蛙卤。如果要定義新的變量,可以使用declare命令以變量名=值的格式進行定義即可噩死。其常用的語法格式如下:
set(選項)(參數(shù))

  • declare mylove='Visual C++' #定義新環(huán)境變量
  • set -a mylove #設(shè)置為環(huán)境變量
  • env | grep mylove #顯示環(huán)境變量值
3.2.2 alias命令

alias命令用來設(shè)置指令的別名颤难。其常用的語法格式如下:
alias 新的命令='原命令 -選項/參數(shù)'

3.3 read命令

可以使用read命令將用戶的輸入賦值給一個變量。

  xuqing@master: ~ $ read foo
  test
  xuqing@master: ~ $ echo $foo
  test
3.4 引號的使用

一般情況下已维,Shell腳本中的參數(shù)以空白字符隔開行嗤。如果要在一個參數(shù)中包含一個或多個空白字符,必須給參數(shù)加上引號垛耳。

  • “$foo”栅屏,雙引號,會用變量替換它的值堂鲜;

  • ‘$foo’栈雳,單引號,不會發(fā)生替換行為缔莲;

  • $foo哥纫,取消變量的特殊含義;
    以下腳本variable.sh

     #!/bin/bash
     myvar="Hi here";
     echo $myvar
     echo "$myvar"
     echo "'$myvar'"  //這里你會發(fā)現(xiàn)加了雙引號以后'$myvar'仍然被識別為一個字符串
     echo '$myvar'
     echo \$myvar
    
     echo "Enter some text"
     read myvar
    
     echo '$myvar' now equals $myvar
    
     exit 0
    

執(zhí)行的結(jié)果如下:

  xuqing@master: ~ $ bash varible.sh
  Hi here
  Hi here
  Hi here
  $myvar
  $myvar
  Enter some text
  hello
  $myvar now equals hello
3.5 使用$(command)語法

編寫腳本程序時酌予,經(jīng)常需要捕獲一條命令的執(zhí)行結(jié)果磺箕,例如把命令的輸出放到一個變量中奖慌,這時可以使用$(command)語法來實現(xiàn)抛虫。
例如:test.sh

  #!/bin/bash

  echo the current directory is $(pwd)
  thisdate=$(date)
  echo the current data is $thisdate

  exit 0

運行的結(jié)果:

  xuqing@master: ~ $ bash test.sh
  the current directory is /home/xuqing
  ....

4、環(huán)境變量

環(huán)境變量是給Linux系統(tǒng)或用戶程序設(shè)置的一些參數(shù)简僧,其作用和具體的環(huán)境變量相關(guān)建椰,例如:PATH存儲了系統(tǒng)常用命令所在的目錄,HOME存儲的是當(dāng)前用戶的目錄岛马。
當(dāng)一個Shell腳本程序開始執(zhí)行時棉姐,一些變量會根據(jù)環(huán)境設(shè)置中的值進行初始化。用戶可以在Shell腳本程序中像引用自己定義的變量一樣用$引用它們啦逆。

  • $PATH伞矩,以冒號分割,通常用來搜索命令的目錄列表夏志;
  • $HOME乃坤,當(dāng)前用戶的主目錄;
  • $0,Shell腳本程序的名字湿诊;
  • $#狱杰,傳遞給腳本的參數(shù)個數(shù),如果腳本程序在調(diào)用時沒有傳遞任何參數(shù)厅须,則其值是0仿畸;
  • $IFS,輸入域分隔符朗和。當(dāng)Shell讀取輸入時错沽,它給出用來分隔單詞的一組字符,通常是空格眶拉、制表符和換行符等甥捺。
4.1 參數(shù)變量

如果腳本程序在調(diào)用時帶有參數(shù),一些額外的參數(shù)變量會被創(chuàng)建镀层。

  • 1镰禾,2...,腳本程序調(diào)用時傳遞過來的參數(shù)唱逢;
  • $*吴侦,在一個變量中列出所有的參數(shù),各參數(shù)之間用空格分隔開坞古;
4.2 設(shè)置參數(shù)變量

set命令的作用是為Shell設(shè)置參數(shù)變量备韧。許多命令的輸出結(jié)果是以空格分隔的值,如果需要使用輸出結(jié)果中的某個域痪枫,就可以用到set命令织堂,其語法格式如下:
set $(command)

  #!/bin/bash

   echo "the current date is $(date)"
   set $(date)
   echo "the current month is $2"

   exit 0

5、條件

在Shell腳本中奶陈,可以使用if/then結(jié)構(gòu)對條件進行測試判斷易阳,并根據(jù)測試結(jié)果采取不同的執(zhí)行流程。
在實際工作中吃粒,大多數(shù)腳本程序都會廣泛使用Shell的布爾判斷命令“[”潦俺,或“test”來實現(xiàn)測試。為了增強可讀性徐勃,當(dāng)使用“[”命令時事示,還是用“[”來結(jié)尾。
注意:必須在“[”和被檢查的條件之間留出空格僻肖。這與test命令時一樣的肖爵,因為test命令之后總是有一個空格。
test命令能夠使用的條件類型可以歸為4類:字符串比較臀脏,算術(shù)比較劝堪、邏輯運算與文件有關(guān)的條件測試法挨。

5.1分支語句
  • if-then
  • for
  • while
  • until
  • break
  • case

6、函數(shù)

Shell允許將一組命令集或語句形成一個可用塊幅聘,這些塊稱為Shell函數(shù)凡纳。函數(shù)由兩部分組成:函數(shù)標題和函數(shù)體。標題是函數(shù)名帝蒿,函數(shù)名在當(dāng)前Shell腳本中應(yīng)該唯一荐糜;函數(shù)體是函數(shù)內(nèi)的命令集合。

  #!/bin/bash
 
  fun()
  {
       echo "Function is executing"
   }
   echo "ready call"
   fun
   echo "call end"

   exit 0
6.1 退出和返回值

執(zhí)行完畢后自動退出葛超,也可以使用return語句在執(zhí)行過程中提前退出暴氏。
return [value]
value 可選是整數(shù)值,一般情況下使用0表示函數(shù)執(zhí)行成功绣张,非0表示出錯代碼答渔。函數(shù)的退出值使用“$?”獲得。

6.2 參數(shù)傳遞

在函數(shù)內(nèi)部侥涵,與傳遞給Shell腳本參數(shù)一樣沼撕,通過“1、2...”來獲取傳遞進來的參數(shù)芜飘。

  #!/bin/bash
  fun()
  {
   echo "the first parameter is $1"
   echo "the second parameter is $2"
   return 0
   }

    fun "123" "456"
    if [ $? = 0]
    then
    echo "fun execute success"
    else
    echo "fun execute faliure"
    fi

    exit 0
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末务豺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嗦明,更是在濱河造成了極大的恐慌笼沥,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娶牌,死亡現(xiàn)場離奇詭異奔浅,居然都是意外死亡,警方通過查閱死者的電腦和手機诗良,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門汹桦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人累榜,你說我怎么就攤上這事营勤×橄樱” “怎么了壹罚?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寿羞。 經(jīng)常有香客問我猖凛,道長,這世上最難降的妖魔是什么绪穆? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任辨泳,我火速辦了婚禮虱岂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘菠红。我一直安慰自己第岖,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布试溯。 她就那樣靜靜地躺著蔑滓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遇绞。 梳的紋絲不亂的頭發(fā)上键袱,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音摹闽,去河邊找鬼蹄咖。 笑死,一個胖子當(dāng)著我的面吹牛付鹿,可吹牛的內(nèi)容都是我干的澜汤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼舵匾,長吁一口氣:“原來是場噩夢啊……” “哼银亲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纽匙,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤务蝠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后烛缔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馏段,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年践瓷,在試婚紗的時候發(fā)現(xiàn)自己被綠了院喜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡晕翠,死狀恐怖喷舀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情淋肾,我是刑警寧澤硫麻,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站樊卓,受9級特大地震影響拿愧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碌尔,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一浇辜、第九天 我趴在偏房一處隱蔽的房頂上張望券敌。 院中可真熱鬧,春花似錦柳洋、人聲如沸待诅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咱士。三九已至,卻和暖如春轧钓,著一層夾襖步出監(jiān)牢的瞬間序厉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工毕箍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弛房,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓而柑,卻偏偏與公主長得像文捶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子媒咳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Shell簡介 Shell會執(zhí)行用戶輸入的命令粹排,并且在屏幕上顯示執(zhí)行的結(jié)果。 單從字面的意思上理解涩澡,Shell的本...
    故事狗閱讀 1,732評論 2 10
  • 1. shell腳本: 包含一些命令或聲明顽耳,并符合一定格式的文本文件 ? 格式要求:首行shebang(#!)機制...
    尛尛大尹閱讀 1,881評論 0 1
  • Bash內(nèi)置基本變量 PWD : 顯示當(dāng)前的工作目錄 OLDPWD : 顯示上一次的工作目錄 ~:用戶家目錄 - ...
    魏鎮(zhèn)坪閱讀 1,516評論 0 6
  • 函數(shù)的基本含義函數(shù)的定義和使用數(shù)組字符串處理特殊的處理變量用法 一、函數(shù)基本含義: 函數(shù):多條Shell命令組成的...
    哈嘍別樣閱讀 277評論 0 1
  • Kali-LinuxShell編程 【課程目的】 1.掌握shell的基本命令 2.掌握shell的基本概念和作用...
    FX喂你袋鹽閱讀 371評論 0 0