shell程式設計之截斷字串

2021-04-22 11:50:44 字數 3427 閱讀 8462

象專業人員那樣截斷字串

盡 管 basename 和 dirname 是很好的工具,但有時可能需要執行更高階的字串「截斷」,而不只是標準的路徑名操作。當需要更強的說服力 時,可以利用 bash 內建的變數擴充套件功能。已經使用了類似於 $ 的標準型別的變數擴充套件。但是 bash 自身也可以執行一些便利的字 符串截斷。看一下這些例子:

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

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

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

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

$ myfoo="chickensoup.tar.gz"

$ echo $

chickensoup

$ echo $

chickensoup.tar

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

myfood="chickensoup"

$ echo $

chicken

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

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

$ exclaim=cowabunga

$ echo $

cow$ echo $

abunga

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

應用字串截斷

現在我們已經學習了所有截斷字串的知識,下面寫乙個簡單短小的 shell 指令碼。我們的指令碼將接受乙個檔案作為自變數,然後列印:該檔案是否是乙個 tar 檔案。要確定它是否是 tar 檔案,將在檔案末尾查詢模式 ".tar"。如下所示:

mytar.sh -- 乙個簡單的指令碼

#!/bin/bash

if [ "$" = "tar" ]

then 

else

fi

要執行此指令碼,將它輸入到檔案 mytar.sh 中,然後輸入 "chmod 755 mytar.sh",生成可執行檔案。然後,如下做一下 tar 檔案試驗:

$ ./mytar.sh thisfile.tar

$ ./mytar.sh thatfile.gz

好, 成功執行,但是不太實用。在使它更實用之前,先看一下上面使用的 "if" 語句。語句中使用了乙個布林表示式。在 bash 中,"=" 比較運算子檢 查字串是否相等。在 bash 中,所有布林表示式都用方括號括起。但是布林表示式實際上測試什麼?讓我們看一下左邊。根據前面所學的字串截斷知 識,"$" 將從環境變數 "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" 語句之後的行。 

Shell教程之Shell字串

shell 字串 字串是shell程式設計中最常用最有用的資料型別 除了數字和字串,也沒啥其它型別好用了 字串可以用單引號,也可以用雙引號,也可以不用引號。單引號 str this is a string 單引號字串的限制 單引號裡的任何字元都會原樣輸出,單引號字串中的變數是無效的 單引號字串中不能...

CSS截斷字串

方法一 任意長度的字串 說明 優點是內容可以為任何html元素,包括超連結和等,在ie6中還會在結尾自動顯示省略號。缺點是必須指定寬度數值,並且寬度不能是百分數,否則在ie中會被認為是字元總長的百分比。方法二 說明 優點是寬度可以設為百分數。但缺點是內容只能為純文字,不能有超連結等內容。css 截斷...

php程式設計之字串

1 常用的字串輸出函式 echo print die exit 函式的別名 可在推出程式時輸出一些資訊 printf 格式化字串 b c d f o x s等 sprintf 返回格式化後的字串,不輸出。2 常用的字串格式化函式 trim ltrim rtrim 剔除函式 str pad 字串填充函...