Linux / Unix命令:expr

'expr'命令从shell中计算数学表达式

expr.效用Linuxshell连接参数,然后作为Tcl表达式计算结果,将值返回到标准输出。

TCL表达式允许的操作员是C表达式允许的操作员的子集,它们具有与相应的C运算符相同的含义和优先级。表达几乎总是产生数值结果(整数或浮点值)。

键入在键盘的人
dm909 /时间/盖蒂图片社

剧情简介

该命令采用以下一般形式:

expr arg1 arg2 ...

操作数

TCL表达式包括操作数,运算符和括号的组合。操作数和运营商和括号之间可以使用空白;表达式的指示忽略了它。

在可能的情况下,操作数被解释为整数值。整数值可以用十进制(一般情况)或八进制(如果操作数的第一个字符是0),或采用十六进制(如果操作数的前两个字符是0x.).如果操作数不具有上面给出的整数格式之一,则在可能的情况下将其视为浮点数。

浮点数可以用符合ansi标准的C编译器所接受的任何方式指定(除了fFl,l在大多数安装中不允许使用后缀)。例如,以下所有内容都是有效的浮点数:2.13.6 e47.91 e + 16.如果不能进行数字解释,则操作数将保留为字符串,只能对其应用有限的操作符集。

操作数可以通过以下任何方式指定:

  • 作为数值,整数或浮点。
  • 作为TCL变量,使用标准符号。变量的值将被用作操作数。
  • 用双引号括起来的字符串。表达式解析器将对引号之间的信息执行反斜杠、变量和命令替换,并使用结果值作为操作数。
  • 用大括号括起来的字符串。左大括号和匹配的右大括号之间的字符将被用作操作数,不需要任何替换。
  • 作为一个括在括号中的Tcl命令。命令将被执行,其结果将被用作操作数。
  • 作为一个数学函数,其参数具有以上操作数的任何上述表格,例如sin (x)美元

如果替换发生在上面(例如在引号内的字符串),则由表达式的指令执行。然而,在调用表达式处理器之前,命令解析器可能已经执行了额外的替换层。

对于一些简单表达式的示例,假设变量一个有值3和变量b值为6。然后,下面每一行左侧的命令将生成该行右侧的值:

expr 3.1 + $ a6.1
$a.$b .$b
2 . n .复合体,复合体
表达式{{word 1} < "word $a"}0

运营商

下面列出了有效的操作符,按优先级降序分组:

  • - + ~ !:一元减去,一元加上,比特,不,逻辑没有。这些操作数都不可以应用于字符串操作数,并且不能仅应用于整数的比特。
  • * / %:乘以,划分,余数。这些操作数都不可以应用于字符串操作数,并且其余部分可以仅应用于整数。其余的将始终具有与除数相同的符号,并且绝对值小于除数。
  • + -:添加和减去。适用于任何数字操作数。
  • << >>:左右转移。仅适用于整数操作数。右移始终传播符号位。
  • < > <= >=:布尔值:小于,大于,小于或等于,大于或等于。如果条件为真,每个操作符生成1,否则生成0。这些操作符可以应用于字符串,也可以应用于数字操作数,在这种情况下使用字符串比较。
  • = =。=:布尔值相等和不相等。每个运算符产生一个0 / 1的结果。对所有操作数类型有效。
  • :有点明智和。仅适用于整数操作数。
  • :按位排他的OR。仅适用于整数操作数。
  • |:位操作或。仅适用于整数操作数。
  • & &:逻辑。如果两个操作数都非零,则产生1结果,否则为0。仅对布尔和数字(整数或浮点数)操作数有效。
  • | |:逻辑或。如果两个操作数都是0,则产生0结果,否则为1。仅对布尔和数字(整数或浮点数)操作数有效。
  • xyz:if-then-else,如在c。x计算为非零,则结果为y.否则,结果为的值z.的x操作数必须是数值。

有关每个操作员产生的结果的更多详细信息,请参阅C手册。全部二进制运营商在相同的优先级内从左到右分组。例如,命令

4 . n .复合体,复合体

返回0。

& &||,?:操作员具有“懒惰评估”,就像在C中一样,这意味着如果不需要确定结果,则不会评估操作数。例如,在命令

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

只有一个[一种]或者[B]将实际被评估,取决于v美元.但是,请注意,只有整个表达式用大括号括起来时才成立;否则,Tcl解析器将计算两者[一种][B]在调用之前expr.命令。

数学函数

Tcl支持以下表达式中的数学函数:

  • ABS(arg.:返回的绝对值arg.arg.可以是整数,也可以是浮点数,并且以相同的形式返回结果。
  • ACOS(arg.:返回arccosarg.,在[0,pi]弧度范围内。arg.应该在[-1,1]范围内。
  • 最佳翻译(arg.:返回弧形正弦arg.在[- /2,/2]弧度范围内。arg.应该在[-1,1]范围内。
  • :arg.:返回的arctan值arg.在[- /2,/2]弧度范围内。
  • atan2(X,Y.:返回的arctan值y/x,在弧度范围内。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时,返回错误。
  • 函数的X,Y.:计算直角三角形的斜边长度(xx+yy).
  • int(arg.: 如果arg.是整数值,返回arg.,否则转换arg.通过截断到整数并返回转换后的值。
  • 日志(arg.:返回的自然对数arg.arg.必须是正值。
  • log10(arg.:返回以10为底的对数arg.arg.必须是正值。
  • 战俘(X,Y.:计算值x提高到权力y.如果x是消极的,y必须是整数值。
  • rand ():返回一个从0到小于1的浮点数,用数学术语来说,就是范围[0,1)。种子来自机器的内部时钟,也可以通过srand功能手动设置。
  • 圆(arg.: 如果arg.是整数值,返回arg.,否则转换arg.通过舍入转换为整数,并返回转换后的值。
  • 罪(arg.:返回的正弦值arg.在弧度中测量。
  • sinh (arg.:返回的双曲正弦值arg..如果结果会导致溢出,则返回错误。
  • arg.:返回根号arg.arg.必须是非负面的。
  • srand(arg.:arg.,必须为整数,用于重置随机数生成器的种子。返回该种子的第一个随机数。每个解释器都有自己的种子。
  • 谭(arg.:返回正切值arg.在弧度中测量。
  • Tanh(arg.:返回的双曲正切值arg.

除了这些预定义的函数外,应用程序还可以使用Tcl_CreateMathFunc().

类型、溢出和精度

所有涉及整数的内部计算都是用C类型完成的,涉及浮点的所有内部计算都是用C型完成的.将字符串转换为浮点时,检测指数溢出并导致TCL错误。要从字符串转换为整数,检测溢出取决于本地C库中某些例程的行为,因此它应该被视为不可靠。在任何情况下,通常无法可靠地检测到整数溢出和下溢,以便中间结果可靠地检测。浮点溢出和欠流量被检测到硬件支持的程度,这通常非常可靠。

根据需要自动完成整数,浮点和字符串操作数之间的内部表示转换。对于算术计算,使用整数直到引入一些浮点数,之后使用浮点。例如,

5 / 4

返回1,而

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倾向于在可能的情况下将值视为数字,使用诸如此类的操作符通常不是一个好主意==当你真的想要字符串比较并且操作数的值可能是任意的;在这些情况下更好使用细绳命令。

这个页面有用吗?