expr命令

 expr 命令 

用途

 

求表達式變量的值。

 

語法

expr Expression

 

描述

 

expr 命令讀入 Expression 參數,計算它的值,然後將結果寫入到標準輸出。

 

您必須對 Expression 參數應用下列規則:

  • 用空格隔開每個項。
  • 用 / (反斜槓) 放在 shell 特定的字符前面。
  • 對包含空格和其他特殊字符的字符串要用引號括起來。

 

整數前面可以放一個一元連字符。在內部,整數被當作 32 位,雙互補數。

注意:expr命令返回一個 0 來指示一個零值,而不是空字符串。

 

下列項描述了 Expression 參數的運算符和關鍵字。需要轉義的字符由一個 / (反斜槓) 放在前面。這些項按照優先權遞增的順序列出,具有相等的優先權的運算符分組在 {} (大括號) 中:

 

Expression1 /| Expression2 返回 Expression1如果它不是空值或者 0 值的話,否則返回 Expression2。
Expression1 /& Expression2 返回 Expression1如果兩個表達式都不是空值或者 0 值,否則返回一個 0 值。
Expression1 { =, />, />=, /<, /<=, != } Expression2 如果兩個表達式都是整數,返回整數比較的結果;否則它返回的是字符串比較的結果。
Expression1 {+, - } Expression2 整數值變量的加或者減。
Expression1 { /*, /, % } Expression2 整數值變量的乘、除或者提供除法的餘數。
Expression1 : Expression2 將 Expression1 的運算得到的字符串與 Expression2 的運算結果的正則表達式模式進行比較。正則表達式語法與 ed 命令相同,除了所有的模式固定到字符串的開始之外(也就是說,只有以字符串的第一個字符開始的序列才被正則表達式匹配)。因此 ^ (插入符號) 在這種情況下就不是特殊字符。

一般地,匹配運算符返回匹配的字符個數(失敗的時候返回 0)。如果模式包含了一個子表達式,也就是:

/( Expression /)

,那麼會返回包含了實際匹配的字符的字符串。

整理序列可以定義在字符範圍內使用的等價類。有關整理序列和等價類的更多的信息,請參閱 AIX 5L Version 5.2 System Management Concepts: Operating System and Devices 中的 “Understanding Locale Environment Variables” 。

 
注意: 下列字符串變量會超過標準,其行爲可能在不同的操作系統中會有不同。這些字符串變量是“不”可移植的。

 

match String1 String2 與 Expression1 : Expression2 相同。
length String1 返回 String1 的長度。
index String1 String2 返回 String1 中包含 String2 中任意字符的第一個位置。
substr String1 StartPosition Length
  返回一個以 StartPosition 的字符開始的在 String1 中的字符串,並且是 Length 長度的字符串。

退出狀態

 

此命令返回下列出口值:

 

0 Expression 參數運算值既不爲空也不爲 0。
1 Expression 參數的計算值或者爲空或者爲 0。
2 Expression 參數是不合法的。
>2 發生錯誤。
注意:在 shell 處理完參數後,expr 命令除了利用數值外不能區分運算符和操作數。因此,如果 $a 的值是 j 的話,命令:

 

expr $a = j

 

就像:

 

expr j = j

 

在 shell 將所有的參數都傳給 expr 命令之後。下列情況也爲真:

 

expr X$a = Xj

 

示例

  1.  要修改一個 shell 變量,請輸入:
    COUNT=`expr $COUNT + 1`

    這會加 1 到 shell 變量 $COUNT 上。 expr 命令以 grave accent 包裝,這會導致 shell 將 expr 命令的標準輸出替換到 COUNT= 命令的標準輸出。$COUNT 變量使用前必須初始化。

  2.  要想得到 $STR shell 變量的長度,請輸入:
    LENGTH=`expr $STR : ".*"`

    這會將 LENGTH 變量設置成由 :(冒號)運算符給出的值。.*(點,星號)模式會對任何字符串從頭到尾去匹配,因此冒號運算符給出 $STR 變量的長度作爲匹配字符的數目。注意,.* 必須在引號內,來防止 shell 將 *(星號)處理成模式匹配字符。引號不是模式中的一部分。

    如果 $STR 變量設置成空字符串或者包含了任何空格(空白或者製表鍵)的話,那麼該命令會顯示錯誤信息 expr: syntax error。這 是因爲 shell 通常不會將空字符串傳遞給命令。在這種情況下,expr 命令只能看見:

    :.*

    shell 還會除去單個的引號。不起作用的原因是因爲冒號運算符要求有兩個值。這個問題可以通過將 shell 變量以雙引號括起來解決:

    LENGTH=`expr "$STR" : ".*"`

    現在,如果 $STR 變量的值爲空的話,LENGTH 變量被設置成 0 值。通常我們推薦將 shell 變量用雙引號括起來。不要將 shell 變量用單引號標記括起來。

  3.  要想使用一個字符串的一部分,請輸入:
    FLAG=`expr "$FLAG" : "-*/(.*/)"`

    只要 $FLAG shell 變量前面有連字符,就會除去連字符。冒號運算符給出 FLAG 變量的一部分,該變量由在 /( 和 /) 字符(反斜槓,開括號和反斜槓,閉括號)中間的子表達式匹配。如果您忽略 /( 和 /) 子表達式字符的話,冒號運算符會給出匹配的字符數目。

    如果 $FLAG 變量設置成 - (連字符), 則該命令會顯示一個語法錯誤消息。這是因爲 shell 會將 $FLAG 變量的值替換,在運行 expr 命令之前。expr 命令不知道連字符是一個變量的值。它只能理解:

    - : -*/(.*/)

    並且它會將第一個連字符解釋成減號運算符。要消除這種問題,請使用:

    FLAG=`expr "x$FLAG" : "x-*/(.*/)"`
  4.  要想使用 expr 命令在 if 語句中,請輸入:
    if expr "$ANSWER" : "[yY]" >/dev/null
    則返回 ANSWER 以 "y" 或者 "Y" 開始 fi

    如果 $ANSWER 變量以 y 或者 Y 開始的話,if 語句的then 部分會執行。如果匹配成功表達式的結果爲 1,並且 expr 命令會返回一個爲 0 的出口值,這個出口值被 if 語句識別成邏輯值真。如果匹配失敗,結果爲 0,出口值爲 1。

    將 expr 命令的標準輸出重新定向到 /dev/null 特殊文件,而廢棄該表達式的結果。如果您沒有對它重新定向,結果就會寫到標準輸出中,通常是您的工作站顯示器。

  5.  考慮下列表達式:
    expr "$STR" = "="

    如果 $STR 變量有值爲 =(等號),那麼在 shell 處理完這個命令之後,expr命令會看到表達式:

    = = =

    expr 命令將這個解釋成在一行中的三個等號運算符,並顯示一個語法出錯消息。一旦 shell 變量的值與 expr 運算符中的一個相同,這種情況就會發生。避免這種問題的方法是,將該表達式寫成:

    expr "x$STR" = "x="
  6.  要想返回 $SHELL 環境變量 /usr/bin/ksh 的長度,請輸入:
    expr length $SHELL

    顯示如下:

    12
  7.  要想返回 "de" 字符串中的任何一個字符在 "abcdef" 中出現的第一個位置,請輸入:
    expr index abcdef de

    顯示如下:T

    4
  8.  要想返回 "fd" 字符串的任何字符在 "abcdef" 中出現的第一個位置,請輸入:
    expr index abcdef fd

    顯示如下:

    4
  9.  要想返回 "Goodnight Ladies" 字符串中從位置11開始的6個字符長的字符串,請輸入:
    expr substr "Goodnight Ladies" 11 6

    顯示如下:

    Ladies

=============================================================

expr命令是一個手工命令行計數器,用於在UNIX/LINUX下求表達式變量的值,一般用於整數值,也可用於字 符串。
–格式爲:
expr Expression(命令讀入Expression 參數,計算它的值,然後將結果寫入到標準輸出)
– 參數應用規則:
用空格隔開每個項;
用 / (反斜槓) 放在 shell 特定的字符前面;
對包含空格和其 他 特殊字符的字符串要用引號括起來

–expr用法實例講 解:
(1)、計算字串長度
 > expr length “this is a test ”
 14
(2)、 抓取字串
 > expr substr “this is a test” 3 5
 is is
(3)、抓取第一個字符數 字串出現的位置
 > expr index “sarasara”  a
 2
(4)、字串真實重現
 > expr quote sara
 sara
(5)、整數運算
 > expr 14 % 9
 5
 > expr 10 + 10
 20
 > expr 1000 + 900
 1900
 > expr 30 / 3 / 2
 5
 > expr 30 /* 3 (使用乘號時,必須用反斜線屏蔽其特定含義。因爲shell可能會誤解顯示星號的意義)
 90
 > expr 30 * 3
 expr: Syntax error
(6)、增量計數
說明:expr在循環中用於增量計算。先將變量初始化爲0,然後循環值加1,反引號的用法爲 命令替代。
> LOOP=0
> LOOP=`expr $LOOP + 1`
(7)、數值測試 
說明:用expr測試一個數。如果試圖計算非整 數,則會返回錯誤。
> rr=3.4
> expr $rr + 1
expr: non-numeric argument
> rr=5
> expr $rr + 1
6
(8)、模式匹配
說明:expr也有 模式匹配功能。可以使用expr通過指定冒號選項計算字符串中字符數。.*意即任何字符重複0次或多次。
> VALUE=account.doc
> expr $VALUE : ‘.*’
8
在expr中可以使用字符串匹配操作,這 裏使用模式抽取.doc文件附屬名。
$expr $VALUE : ‘/(.*/).doc’
accounts


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章