青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

攀升·Uranus


Something Different,Something New
數據加載中……

(轉)Bash 實例,第一部分

其實我不想轉載,但IBM網站實在太慢了

轉自:http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-1/

Bash 實例,第一部分

Bourne again shell (bash) 基本編程

級別: 初級

Daniel Robbins (drobbins@gentoo.org), 總裁兼 CEO, Gentoo Technologies, Inc.

2000 年 3 月 01 日

通過學習如何使用 bash 腳本語言編程,將使 Linux 的日常交互更有趣和有生產力,同時還可以利用那些已熟悉和喜愛的標準 UNIX 概念(如管道和重定向)。在此三部分系列中,Daniel Robbins 將以示例指導您如何用 bash 編程。他將講述非常基本的知識(這使此系列十分適合初學者),并在后續系列中逐步引入更高級特性。

您可能要問:為什么要學習 Bash 編程?好,以下是幾條令人信服的理由:

已經在運行它

如果查看一下,可能會發現:您現在正在運行 bash。因為 bash 是標準 Linux shell,并用于各種目的,所以,即使更改了缺省 shell,bash 可能 在系統中某處運行。因為 bash 已在運行,以后運行的任何 bash 腳本都天生是有效利用內存的,因為它們與任何已運行的 bash 進程共享內存。如果正在運行的工具可以勝任工作,并且做得很好,為什么還要裝入一個 500K 的解釋器?





回頁首


已經在使用它

不僅在運行 bash,實際上,您每天還在與 bash 打交道。它總在那里,因此學習如何最大限度使用它是有意義的。這樣做將使您的 bash 經驗更有趣和有生產力。但是為什么要學習 bash 編程 ?很簡單,因為您已在考慮如何運行命令、CPing 文件以及管道化和重定向輸出。為什么不學習一種語言,以便使用和利用那些已熟悉和喜愛的強大省時的概念?命令 shell 開啟了 UNIX 系統的潛能,而 bash 正是 這個 Linux shell。它是您和機器之間的高級紐帶。增長 bash 知識吧,這將自動提高您在 Linux 和 UNIX 中的生產力 -- 就那么簡單。





回頁首


Bash 困惑

以錯誤方式學習 bash 令人十分困惑。許多新手輸入 "man bash" 來查看 bash 幫助頁,但只得到非常簡單和技術方面的 shell 功能性描述。還有人輸入 "info bash"(來查看 GNU 信息文檔),只能得到重新顯示的幫助頁,或者(如果幸運)略為友好的信息文檔。

盡管這可能使初學者有些失望,但標準 bash 文檔無法滿足所有人的要求,它只適合那些已大體熟悉 shell 編程的人。幫助頁中確實有很多極好的技術信息,但對初學者的幫助卻有限。

這就是本系列的目的所在。在本系列中,我將講述如何實際使用 bash 編程概念,以便編寫自己的腳本。與技術描述不同,我將以簡單的語言為您解釋,使您不僅知道事情做什么,還知道應在何時使用。在此三部分系列末尾,您將可以自己編寫復雜的 bash 腳本,并可以自如地使用 bash 以及通過閱讀(和理解)標準 bash 文檔來補充知識。讓我們開始吧。





回頁首


環境變量

在 bash 和幾乎所有其它 shell 中,用戶可以定義環境變量,這些環境變量在以 ASCII 字符串存儲。環境變量的最便利之處在于:它們是 UNIX 進程模型的標準部分。這意味著:環境變量不僅由 shell 腳本獨用,而且還可以由編譯過的標準程序使用。當在 bash 中“導出”環境變量時,以后運行的任何程序,不管是不是 shell 腳本,都可以讀取設置。一個很好的例子是 vipw 命令,它通常允許 root 用戶編輯系統口令文件。通過將 EDITOR 環境變量設置成喜愛的文本編輯器名稱,可以配置 vipw,使其使用該編輯器,而不使用 vi,如果習慣于 xemacs 而確實不喜歡 vi,那么這是很便利的。

在 bash 中定義環境變量的標準方法是:

$ myvar='This is my environment variable!'
                        

以上命令定義了一個名為 "myvar" 的環境變量,并包含字符串 "This is my environment variable!"。以上有幾點注意事項:第一,在等號 "=" 的兩邊沒有空格,任何空格將導致錯誤(試一下看看)。第二個件要注意的事是:雖然在定義一個字時可以省略引號,但是當定義的環境變量值多于一個字時(包含空格或制表鍵),引號是必須的。

引用細節

有關如何在 bash 中使用引號的非常詳盡的信息,請參閱 bash 幫助頁面中的“引用”一節。特殊字符序列由其它值“擴展”(替換)確實使 bash 中字符串的處理變得復雜。本系列將只講述最常用的引用功能。

第三,雖然通常可以用雙引號來替代單引號,但在上例中,這樣做會導致錯誤。為什么呢?因為使用單引號禁用了稱為擴展的 bash 特性,其中,特殊字符和字符系列由值替換。例如,"!" 字符是歷史擴展字符,bash 通常將其替換為前面輸入的命令。(本系列文章中將不講述歷史擴展,因為它在 bash 編程中不常用。有關歷史擴展的詳細信息,請參閱 bash 幫助頁中的“歷史擴展”一節。)盡管這個類似于宏的功能很便利,但我們現在只想在環境變量后面加上一個簡單的感嘆號,而不是宏。

現在,讓我們看一下如何實際使用環境變量。這有一個例子:

$ echo $myvar
                        This is my environment variable!
                        

通過在環境變量的前面加上一個 $,可以使 bash 用 myvar 的值替換它。這在 bash 術語中叫做“變量擴展”。但是,這樣做將怎樣:

$ echo foo$myvarbar
                        foo
                        

我們希望回顯 "fooThis is my environment variable!bar",但卻不是這樣。錯在哪里?簡單地說,bash 變量擴展設施陷入了困惑。它無法識別要擴展哪一個變量:$m、$my、$myvar 、$myvarbar 等等。如何更明確清楚地告述 bash 引用哪一個變量?試一下這個:

$ echo foo${myvar}bar
                        fooThis is my environment variable!bar
                        

如您所見,當環境變量沒有與周圍文本明顯分開時,可以用花括號將它括起。雖然 $myvar 可以更快輸入,并且在大多數情況下正確工作,但 ${myvar} 卻能在幾乎所有情況下正確通過語法分析。除此之外,二者相同,將在本系列的余下部分看到變量擴展的兩種形式。請記住:當環境變量沒有用空白(空格或制表鍵)與周圍文本分開時,請使用更明確的花括號形式。

回想一下,我們還提到過可以“導出”變量。當導出環境變量時,它可以自動地由以后運行的任何腳本或可執行程序環境使用。shell 腳本可以使用 shell 的內置環境變量支持“到達”環境變量,而 C 程序可以使用 getenv() 函數調用。這里有一些 C 代碼示例,輸入并編譯它們 -- 它將幫助我們從 C 的角度理解環境變量:


myvar.c -- 樣本環境變量 C 程序
#include <stdio.h>
                        #include <stdlib.h>
                        int main(void) {
                        char *myenvvar=getenv("EDITOR");
                        printf("The editor environment variable is set to %s\n",myenvvar);
                        }
                        

將上面的代碼保存到文件 myenv.c 中,然后發出以下命令進行編譯:

$ gcc myenv.c -o myenv
                        

現在,目錄中將有一個可執行程序,它在運行時將打印 EDITOR 環境變量的值(如果有值的話)。這是在我機器上運行時的情況:

$ ./myenv
                        The editor environment variable is set to (null)
                        

啊... 因為沒有將 EDITOR 環境變量設置成任何值,所以 C 程序得到一個空字符串。讓我們試著將它設置成特定值:

$ EDITOR=xemacs
                        $ ./myenv
                        The editor environment variable is set to (null)
                        

雖然希望 myenv 打印值 "xemacs",但是因為還沒有導出環境變量,所以它卻沒有很好地工作。這次讓它正確工作:

$ export EDITOR
                        $ ./myenv
                        The editor environment variable is set to xemacs
                        

現在,如您親眼所見:不導出環境變量,另一個進程(在本例中是示例 C 程序)就看不到環境變量。順便提一句,如果愿意,可以在一行定義并導出環境變量,如下所示:

$ export EDITOR=xemacs
                        

這與兩行版本的效果相同。現在該演示如何使用 unset 來除去環境變量:

$ unset EDITOR
                        $ ./myenv
                        The editor environment variable is set to (null)
                        

dirname 和 basename

請注意:dirname 和 basename 不是磁盤上的文件或目錄,它們只是字符串操作命令。





回頁首


截斷字符串概述

截斷字符串是將初始字符串截斷成較小的獨立塊,它是一般 shell 腳本每天執行的任務之一。很多時候,shell 腳本需要采用全限定路徑,并找到結束的文件或目錄。雖然可以用 bash 編碼實現(而且有趣),但標準 basename UNIX 可執行程序可以極好地完成此工作:

$ basename /usr/local/share/doc/foo/foo.txt
                        foo.txt
                        $ basename /usr/home/drobbins
                        drobbins
                        

Basename 是一個截斷字符串的極簡便工具。它的相關命令 dirname 返回 basename 丟棄的“另”一部分路徑。

$ dirname /usr/local/share/doc/foo/foo.txt
                        /usr/local/share/doc/foo
                        $ dirname /usr/home/drobbins/
                        /usr/home
                        





回頁首


命令替換

需要知道一個簡便操作:如何創建一個包含可執行命令結果的環境變量。這很容易:

$ MYDIR=`dirname /usr/local/share/doc/foo/foo.txt`
                        $ echo $MYDIR
                        /usr/local/share/doc/foo
                        

上面所做的稱為“命令替換”。此例中有幾點需要指出。在第一行,簡單地將要執行的命令以 反引號 括起。那不是標準的單引號,而是鍵盤中通常位于 Tab 鍵之上的單引號。可以用 bash 備用命令替換語法來做同樣的事:

$ MYDIR=$(dirname /usr/local/share/doc/foo/foo.txt)
                        $ echo $MYDIR
                        /usr/local/share/doc/foo
                        

如您所見,bash 提供多種方法來執行完全一樣的操作。使用命令替換可以將任何命令或命令管道放在 ` ` 或 $( ) 之間,并將其分配給環境變量。真方便!下面是一個例子,演示如何在命令替換中使用管道:

MYFILES=$(ls /etc | grep pa)
                        bash-2.03$ echo $MYFILES
                        pam.d passwd
                        





回頁首


象專業人員那樣截斷字符串

盡管 basename 和 dirname 是很好的工具,但有時可能需要執行更高級的字符串“截斷”,而不只是標準的路徑名操作。當需要更強的說服力時,可以利用 bash 內置的變量擴展功能。已經使用了類似于 ${MYVAR} 的標準類型的變量擴展。但是 bash 自身也可以執行一些便利的字符串截斷。看一下這些例子:

$ MYVAR=foodforthought.jpg
                        $ echo ${MYVAR##*fo}
                        rthought.jpg
                        $ echo ${MYVAR#*fo}
                        odforthought.jpg
                        

在第一個例子中,輸入了 ${MYVAR##*fo}。它的確切含義是什么?基本上,在 ${ } 中輸入環境變量名稱,兩個 ##,然后是通配符 ("*fo")。然后,bash 取得 MYVAR,找到從字符串 "foodforthought.jpg" 開始處開始、且匹配通配符 "*fo" 的 最長 子字符串,然后將其從字符串的開始處截去。剛開始理解時會有些困難,為了感受一下這個特殊的 "##" 選項如何工作,讓我們一步步地看看 bash 如何完成這個擴展。首先,它從 "foodforthought.jpg" 的開始處搜索與 "*fo" 通配符匹配的子字符串。以下是檢查到的子字符串:

f
                        fo      MATCHES *fo
                        foo
                        food
                        foodf
                        foodfo      MATCHES *fo
                        foodfor
                        foodfort
                        foodforth
                        foodfortho
                        foodforthou
                        foodforthoug
                        foodforthought
                        foodforthought.j
                        foodforthought.jp
                        foodforthought.jpg
                        

在搜索了匹配的字符串之后,可以看到 bash 找到兩個匹配。它選擇最長的匹配,從初始字符串的開始處除去,然后返回結果。

上面所示的第二個變量擴展形式看起來與第一個相同,但是它只使用一個 "#" -- 并且 bash 執行 幾乎 同樣的過程。它查看與第一個例子相同的子字符串系列,但是 bash 從初始字符串除去 最短 的匹配,然后返回結果。所以,一查到 "fo" 子字符串,它就從字符串中除去 "fo",然后返回 "odforthought.jpg"。

這樣說可能會令人十分困惑,下面以一簡單方式記住這個功能。當搜索最長匹配時,使用 ##(因為 ## 比 # 長)。當搜索最短匹配時,使用 #。看,不難記吧!等一下,怎樣記住應該使用 '#' 字符來從字符串開始部分除去?很簡單!注意到了嗎:在美國鍵盤上,shift-4 是 "$",它是 bash 變量擴展字符。在鍵盤上,緊靠 "$" 左邊的是 "#"。這樣,可以看到:"#" 位于 "$" 的“開始處”,因此(根據我們的記憶法),"#" 從字符串的開始處除去字符。您可能要問:如何從字符串末尾除去字符。如果猜到我們使用美國鍵盤上緊靠 "$" 右邊 的字符 ("%),那就猜對了。這里有一些簡單的例子,解釋如何截去字符串的末尾部分:

$ MYFOO="chickensoup.tar.gz"
                        $ echo ${MYFOO%%.*}
                        chickensoup
                        $ echo ${MYFOO%.*}
                        chickensoup.tar
                        

正如您所見,除了將匹配通配符從字符串末尾除去之外,% 和 %% 變量擴展選項與 # 和 ## 的工作方式相同。請注意:如果要從末尾除去特定子字符串,不必使用 "*" 字符:

MYFOOD="chickensoup"
                        $ echo ${MYFOOD%%soup}
                        chicken
                        

在此例中,使用 "%%" 或 "%" 并不重要,因為只能有一個匹配。還要記住:如果忘記了應該使用 "#" 還是 "%",則看一下鍵盤上的 3、4 和 5 鍵,然后猜出來。

可以根據特定字符偏移和長度,使用另一種形式的變量擴展,來選擇特定子字符串。試著在 bash 中輸入以下行:

$ EXCLAIM=cowabunga
                        $ echo ${EXCLAIM:0:3}
                        cow
                        $ echo ${EXCLAIM:3:7}
                        abunga
                        

這種形式的字符串截斷非常簡便,只需用冒號分開來指定起始字符和子字符串長度。





回頁首


應用字符串截斷

現在我們已經學習了所有截斷字符串的知識,下面寫一個簡單短小的 shell 腳本。我們的腳本將接受一個文件作為自變量,然后打印:該文件是否是一個 tar 文件。要確定它是否是 tar 文件,將在文件末尾查找模式 ".tar"。如下所示:


mytar.sh -- 一個簡單的腳本
#!/bin/bash
                        if [ "${1##*.}" = "tar" ]
                        then
                        echo This appears to be a tarball.
                        else
                        echo At first glance, this does not appear to be a tarball.
                        fi
                        

要運行此腳本,將它輸入到文件 mytar.sh 中,然后輸入 "chmod 755 mytar.sh",生成可執行文件。然后,如下做一下 tar 文件試驗:

$ ./mytar.sh thisfile.tar
                        This appears to be a tarball.
                        $ ./mytar.sh thatfile.gz
                        At first glance, this does not appear to be a tarball.
                        

好,成功運行,但是不太實用。在使它更實用之前,先看一下上面使用的 "if" 語句。語句中使用了一個布爾表達式。在 bash 中,"=" 比較運算符檢查字符串是否相等。在 bash 中,所有布爾表達式都用方括號括起。但是布爾表達式實際上測試什么?讓我們看一下左邊。根據前面所學的字符串截斷知識,"${1##*.}" 將從環境變量 "1" 包含的字符串開始部分除去最長的 "*." 匹配,并返回結果。這將返回文件中最后一個 "." 之后的所有部分。顯然,如果文件以 ".tar" 結束,結果將是 "tar",條件也為真。

您可能會想:開始處的 "1" 環境變量是什么。很簡單 -- $1 是傳給腳本的第一個命令行自變量,$2 是第二個,以此類推。好,已經回顧了功能,下面來初探 "if" 語句。





回頁首


If 語句

與大多數語言一樣,bash 有自己的條件形式。在使用時,要遵循以上格式;即,將 "if" 和 "then" 放在不同行,并使 "else" 和結束處必需的 "fi" 與它們水平對齊。這將使代碼易于閱讀和調試。除了 "if,else" 形式之外,還有其它形式的 "if" 語句:

if [ condition ]
                        then
                        action
                        fi
                        

只有當 condition 為真時,該語句才執行操作,否則不執行操作,并繼續執行 "fi" 之后的任何行。

if [ condition ]
                        then
                        action
                        elif [ condition2 ]
                        then
                        action2
                        .
                        .
                        .
                        elif [ condition3 ]
                        then
                        else
                        actionx
                        fi
                        

以上 "elif" 形式將連續測試每個條件,并執行符合第一個 條件的操作。如果沒有條件為真,則將執行 "else" 操作,如果有一個條件為真,則繼續執行整個 "if,elif,else" 語句之后的行

posted on 2010-03-15 11:13 攀升 閱讀(327) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品一区在线观看| 亚洲精品精选| 国色天香一区二区| 国产乱码精品一区二区三区av| 老司机精品福利视频| 亚洲欧美视频在线| 久久精品2019中文字幕| 亚洲欧美韩国| 久久黄色网页| 久久精品官网| 久久久久成人精品免费播放动漫| 久久影院午夜片一区| 亚洲欧美不卡| 久久久久国产精品午夜一区| 久久深夜福利| 欧美成人dvd在线视频| 久久在线免费视频| 免费精品视频| 国产精品国产三级国产a| 亚洲午夜在线观看| 亚洲在线日韩| 欧美一区二区三区四区在线| 午夜欧美大片免费观看| 老色鬼久久亚洲一区二区| 欧美成在线观看| 亚洲视频在线视频| 久久国产精品99国产精| 一本综合精品| 久久嫩草精品久久久精品| 美女网站久久| 国产精品视频大全| 精品99一区二区三区| 国产日韩欧美高清| 亚洲人成网站777色婷婷| 亚洲另类视频| 久久久蜜臀国产一区二区| 欧美77777| 午夜视频一区| 免费在线观看日韩欧美| 国产精品丝袜xxxxxxx| 狠狠色狠狠色综合系列| 日韩午夜在线视频| 欧美大片在线观看| 亚洲女女女同性video| 欧美日韩大片一区二区三区| 亚洲裸体俱乐部裸体舞表演av| 免费日韩视频| 性色一区二区| 欧美激情精品久久久久久变态| 韩国三级在线一区| 亚洲午夜未删减在线观看| 亚洲第一精品夜夜躁人人爽| 一区二区三区日韩| 亚洲春色另类小说| 亚洲欧美日韩视频一区| 欧美伊人精品成人久久综合97 | 麻豆成人在线播放| 老司机aⅴ在线精品导航| 老司机精品久久| 国产精品久久久久久久久久免费| 在线观看国产精品淫| 夜夜嗨一区二区| 麻豆成人av| 久久久久久**毛片大全| 国产精品久久久久久久7电影| 夜夜精品视频一区二区| 欧美一区二区三区四区高清 | 亚洲国产成人av在线| 在线视频欧美精品| 欧美人与性禽动交情品| 亚洲国产另类精品专区| 欧美成人高清| 久久久水蜜桃| 国产欧亚日韩视频| 久久一区二区三区超碰国产精品| 亚洲一卡二卡三卡四卡五卡| 国产女人18毛片水18精品| 亚洲性视频h| 亚洲免费在线观看视频| 国产精品视频免费| 亚洲激情视频| 亚洲激情网址| 欧美成人首页| 亚洲一区精品在线| 99国产精品久久久久老师| 国产精品专区第二| 亚洲欧美另类国产| 久久精品国产清高在天天线| 影音先锋国产精品| 麻豆成人在线观看| 中日韩在线视频| 老司机一区二区| 亚洲娇小video精品| 亚洲国产精品女人久久久| 欧美一级片一区| 亚洲精品美女免费| 亚洲精品综合精品自拍| 国产亚洲欧美另类一区二区三区| 久久精品国产精品亚洲综合| 亚洲国产毛片完整版| 欧美激情一区二区三区在线视频 | 中国女人久久久| 精品福利av| 亚洲欧洲一区二区三区| 欧美少妇一区二区| 亚洲三级电影全部在线观看高清| 亚洲欧洲一区二区在线观看| 国产精品99一区二区| 欧美电影在线播放| 欧美日韩在线观看一区二区| 国产有码一区二区| 久久久蜜臀国产一区二区| 欧美日韩第一页| 久久激情视频免费观看| 久久久久久精| 亚洲午夜影视影院在线观看| 午夜精品久久99蜜桃的功能介绍| 在线观看91精品国产入口| 亚洲一区久久| 亚洲人成啪啪网站| 久久精品一区二区三区中文字幕| 91久久久亚洲精品| 亚洲福利精品| 伊人狠狠色丁香综合尤物| 欧美成人午夜剧场免费观看| 国产热re99久久6国产精品| 欧美亚洲综合网| 国产精品久久久久久超碰| 欧美福利一区二区| 亚洲国产经典视频| 亚洲免费在线看| 欧美亚洲三区| 欧美人妖另类| 99精品免费| 亚洲精品韩国| 欧美/亚洲一区| 久久免费精品视频| 国产亚洲精品高潮| 一区二区毛片| 亚洲天堂成人| 欧美电影资源| 亚洲乱亚洲高清| 亚洲欧洲日韩在线| 欧美国产精品v| 欧美国产精品劲爆| 亚洲人在线视频| 久久久爽爽爽美女图片| 久久综合导航| 一区二区三区在线视频观看| 亚洲精品久久久久| 亚洲视屏一区| 欧美三级特黄| 亚洲午夜电影| 午夜精品久久久久久99热| 国产欧美视频在线观看| 亚洲天堂av在线免费| 久久精品成人一区二区三区蜜臀| 欧美日韩亚洲91| 亚洲欧美怡红院| 欧美在线视频一区二区三区| 国产一区在线看| 欧美影院成年免费版| 麻豆精品在线视频| 亚洲人体大胆视频| 亚洲午夜黄色| 翔田千里一区二区| 黄色成人在线免费| 久久亚洲精选| 亚洲激情视频在线| 亚洲天堂av在线免费观看| 国产日产欧产精品推荐色| 午夜伦欧美伦电影理论片| 夜夜爽av福利精品导航 | 欧美精品三级| 久久久夜精品| 亚洲国产精品黑人久久久| 蜜臀av性久久久久蜜臀aⅴ| 亚洲三级免费观看| 亚洲欧美久久久| 在线观看一区二区精品视频| 欧美大香线蕉线伊人久久国产精品| 一本大道av伊人久久综合| 午夜一级久久| 亚洲精品裸体| 国产精品老牛| 欧美精品一区在线| 久久免费黄色| 欧美日本三区| 亚洲综合日韩在线| 一区二区欧美在线| 好吊色欧美一区二区三区视频| 久久人91精品久久久久久不卡| 亚洲国产专区校园欧美| 亚洲欧美美女| 伊大人香蕉综合8在线视| 欧美精品在线免费| 欧美一区二区三区免费看| 亚洲精品国产系列| av不卡在线观看| 亚洲第一福利在线观看|