Linux / Unix命令:expr

名稱

expr - 評估一個表達式

概要

expr argarg arg ...

連接arg (在它們之間添加分隔符空格),將結果評估為Tcl表達式,並返回該值。 Tcl表達式中允許的運算符是C表達式中允許的運算符的子集,它們與相應的C運算符具有相同的含義和優先級。 表達式幾乎總是產生數值結果 (整數或浮點值)。 例如,表達式

表達8.2 + 6

評估為14.2。 Tcl表達式與C表達式在指定操作數的方式上不同。 另外,Tcl表達式支持非數字操作數和字符串比較。

操作數

Tcl表達式由操作數,運算符和括號組成。 操作數和運算符與括號之間可以使用空格; 它被表達式的指示忽略。 在可能的情況下,操作數被解釋為整數值。 整數值可以用十進制(正常情況下),八進制(如果操作數的第一個字符為0 )或十六進制(如果操作數的前兩個字符為0x )指定。 如果一個操作數沒有上面給出的整數格式之一,那麼它將被視為一個浮點數,如果這是可能的話。 浮點數可以用符合ANSI的C編譯器接受的任何方式指定(除了在大多數安裝中不允許使用fFlL後綴)。 例如,以下所有內容都是有效的浮點數:2.1,3.,6e4,7.91e + 16。 如果沒有數字解釋是可能的,那麼操作數被保留為一個字符串(並且只有有限的一組操作符可以應用於它)。

操作數可以通過以下任何方式指定:

[1]

作為數值,可以是整數或浮點數。

[2]

作為一個Tcl變量,使用標準的$表示法。 該變量的值將被用作操作數。

[3]

作為用雙引號括起來的字符串。 表達式解析器將對引號之間的信息執行反斜杠,變量和命令替換,並將結果值用作操作數

[4]

作為括號中的字符串。 開放大括號和匹配大括號之間的字符將被用作操作數,而不進行任何替換。

[5]

作為括號中的Tcl命令。 該命令將被執行並且其結果將被用作操作數。

[6]

作為一個數學函數,其參數具有任何上述形式的操作數,如sin($ x) 。 請參閱下面的定義功能列表。

在上面發生替換(例如引用字符串內部)時,它們由表達式的指令執行。 但是,在調用表達式處理器之前,命令解析器可能已經執行了額外的替換層。 如下所述,通常最好將括號中的表達式括起來,以防止命令解析器對內容進行替換。

對於簡單表達式的一些示例,假設變量a的值為3,變量b的值為6.然後,下面每行的左側的命令將生成該行右側的值:

expr 3.1 + $ a6.1 expr 2 +“$ a。$ b”5.6 expr 4 * [llength“6 2”] 8 expr {{word one} <“word $ a”} 0

運營商

下面列出了有效的運算符,按照優先級的降序進行分組:

- +〜!

一元減號,一元加號,按位不是,邏輯非。 這些操作數中沒有一個可以應用於字符串操作數,而按位NOT可以僅應用於整數。

* /%

相乘,除,餘數。 這些操作數中沒有一個可以應用於字符串操作數,餘數可能僅適用於整數。 其餘的將始終具有與除數相同的符號和小於除數的絕對值。

+ -

加減法。 適用於任何數字操作數。

<< >>

左右移動。 僅對整數操作數有效。 右移總是傳播符號位。

<> <=> =

布爾減少,大於,小於或等於,大於或等於。 如果條件為真,則每個運算符產生1,否則為0。 這些運算符可以應用於字符串以及數字操作數,在這種情況下使用字符串比較。

==!=

布爾相等而不相等。 每個運算符產生一個零/一個結果。 適用於所有操作數類型。

按位與。 僅對整數操作數有效。

^

按位獨占OR。 僅對整數操作數有效。

|

按位或。 僅對整數操作數有效。

&&

邏輯AND。 如果兩個操作數都為非零,則產生1結果,否則為0。 僅對布爾型和數字(整數或浮點型)操作數有效。

||

邏輯或。 如果兩個操作數均為零,則產生0結果,否則為1。 僅對布爾型和數字(整數或浮點型)操作數有效。

x y z

If-then-else,如在C.如果x評估為非零,那麼結果是y的值。 否則,結果就是z的值。 x操作數必須有一個數值。

有關每個操作員生成的結果的更多詳細信息,請參閱C手冊。 所有的二元運算符在相同的優先級內從左到右分組。 例如,該命令

expr 4 * 2 <7

返回0。

&&|| ,和?:運算符具有“懶惰評估”,就像在C中一樣,這意味著如果不需要確定結果,操作數就不會被評估。 例如,在命令中

expr {$ v? [a]:[b]}

根據$ v的值,實際上只會評估[a][b]中的 一個 。 但是請注意,只有整個表達式用大括號括起來才是正確的。 否則,在調用expr命令之前,Tcl解析器將同時評估[a][b]

數學函數

Tcl在表達式中支持以下數學函數:

abs cosh log sqrt acos double log10 srand asin exp pow tan atan floor rand tanh atan2 fmod round ceil hypot sin cos int sinh

abs( arg

返回arg的絕對值。 Arg可以是整數或浮點數,結果以相同的形式返回。

acos( arg

返回arg的反餘弦,範圍為[0,pi]弧度。 Arg應該在[-1,1]的範圍內。

asin( arg

返回arg的反正弦值,範圍為[-pi / 2,pi / 2]弧度。 Arg應該在[-1,1]的範圍內。

阿坦( arg

返回arg的反正切,範圍為[-pi / 2,pi / 2]弧度。

atan2( x,y

返回y / x的反正切,範圍為[-pi,pi]弧度。 xy不能都是0。

ceil( arg

返回不小於arg的最小整數值。

cos( arg

返回arg的餘弦,以弧度為單位。

cosh( arg

返回arg的雙曲餘弦。 如果結果會導致溢出,則返回錯誤。

雙( arg

如果arg是一個浮點值,則返回arg ,否則將arg轉換為浮點並返迴轉換後的值。

exp( arg

返回arg的指數,定義為e ** arg 。 如果結果會導致溢出,則返回錯誤。

地板( arg

返回不大於arg的最大整數值。

fmod( x,y

返回x除以y的浮點餘數。 如果y為0,則返回錯誤。

hypot( x,y

計算直角三角形( x * x + y * y )斜邊的長度。

int( arg

如果arg是整數值,則返回arg ,否則通過截斷將arg轉換為整數並返迴轉換後的值。

日誌( arg

返回arg的自然對數。 Arg必須是正值。

log10( arg

返回arg的 10進制的對數。 Arg必須是正值。

pow( x,y

計算x增加到y的值 。 如果x是負數,則y必須是整數值。

RAND()

返回從零到小於1的浮點數,或者在數學術語中,返回範圍[0,1)。 種子來自機器的內部時鐘,或者可以通過srand功能進行手動設置。

圓( arg

如果arg是整數值,則返回arg ,否則通過舍入將arg轉換為整數並返迴轉換後的值。

罪( arg

返回arg的正弦值,以弧度為單位。

sinh( arg

返回arg的雙曲正弦值。 如果結果會導致溢出,則返回錯誤。

sqrt( arg

返回arg的平方根。 Arg必須是非負的。

srand( arg

arg必須是一個整數,用於重置隨機數生成器的種子。 返回該種子的第一個隨機數。 每個口譯員都有自己的種子。

tan( arg

返回arg的正切值,以弧度為單位。

tanh( arg

返回arg的雙曲正切。

除了這些預定義的函數之外,應用程序還可以使用Tcl_CreateMathFunc ()定義附加函數。

類型,溢出和精度

所有涉及整數的內部計算都是用C型long來完成的,所有涉及浮點的內部計算都是用C型double來完成的。 將字符串轉換為浮點時,檢測到指數溢出並導致Tcl錯誤。 對於從字符串轉換為整數,溢出的檢測取決於本地C庫中一些例程的行為,因此應視為不可靠。 在任何情況下,對於中間結果,通常不會可靠地檢測到整數溢出和下溢。 在硬件支持的程度上檢測浮點溢出和下溢,通常非常可靠。

整數,浮點和字符串操作數的內部表示之間的轉換根據需要自動完成。 對於算術計算,整數一直使用,直到引入一些浮點數,然後使用浮點數。 例如,

expr 5/4

返回1,while

expr 5 / 4.0 expr 5 /([字符串長度“abcd”] + 0.0)

兩者都返回1.25。 浮點值總是以``返回 ''或e,這樣它們看起來不像整數值。 例如,

expr 20.0 / 5.0

返回4.0 ,而不是4

字符串操作

字符串值可以用作比較運算符的操作數,儘管表達式計算器可能會嘗試將其作為整數或浮點進行比較。 如果比較操作數中的一個是字符串,另一個是數字值,則數字操作數將轉換回使用C sprintf格式說明符%d作為整數, %g作為浮點值的字符串。 例如,命令

expr {“0x03”>“2”} expr {“0y”<“0x12”}

兩者都返回1.第一個比較是使用整數比較完成的,第二個比較是在第二個操作數轉換為字符串18後使用字符串比較完成的。 由於Tcl傾向於盡可能將值視為數字,因此,如果您真的想要字符串比較,並且操作數的值可以是任意的,那麼使用像==這樣的運算符通常不是一個好主意; 在這些情況下最好使用string命令。

性能考慮

將表達式括在大括號中以獲得最佳速度和最小存儲要求。 這允許Tcl字節碼編譯器生成最佳代碼。

如上所述,表達式被替換兩次:一次由Tcl解析器取代,一次由expr命令取代。 例如,命令

設置3 組b {$ a + 2} expr $ b * 4

返回11,不是4的倍數。這是因為Tcl解析器將首先用變量b代替$ a + 2 ,然後expr命令將計算表達式$ a + 2 * 4

大多數表達式不需要第二輪替換。 要么它們被括在大括號中,要么它們的變量和命令替換產生不需要替換的數字或字符串。 但是,由於少數無束縛的表達式需要兩輪替換,所以字節碼編譯器必鬚髮出額外的指令來處理這種情況。 包含命令替換的無支撐表達式需要最昂貴的代碼。 每次執行表達式時都必須通過生成新代碼來實現這些表達式。

關鍵詞

算術, 布爾值 ,比較,表達式,模糊比較

重要提示:使用man命令( %man )查看特定計算機上的命令使用方式。