标签: expr

expr 算术中的括号:3 * (2 + 1)

expr 似乎不喜欢括号(在数学中用于显式运算符优先级):

expr 3 * (2 + 1)
bash: syntax error near unexpected token `('
Run Code Online (Sandbox Code Playgroud)

如何在bash中表达操作员优先级?

shell quoting arithmetic expr

72
推荐指数
5
解决办法
14万
查看次数

使用 expr, $(()), (())

在 shell 脚本中,我们可以expr $a*$b$(($a+$b)).

但为什么不只是 with (($a+$b)),因为在任何资源中,它(())都是为整数计算而编写的。

所以我们$(())在有变量而不是整数值时使用,是吗?$(())当变量可以接收浮点值时,我们应该使用什么来代替?

bash shell-script expr

11
推荐指数
1
解决办法
3万
查看次数

如何在bash中将字符串读取为十六进制数?

我有 bash 线:

expr substr $SUPERBLOCK 64 8
Run Code Online (Sandbox Code Playgroud)

这是返回给我的字符串行:

00080000
Run Code Online (Sandbox Code Playgroud)

我知道这实际上是小端的 0x00080000。有没有办法在像 0x80000 这样的 big-endian 中的 bash 中从它创建整数变量?

bash numeric-data hex expr

7
推荐指数
2
解决办法
5267
查看次数

这个 expr 在 shell 脚本中做什么?

下面具体做了什么?

newProg=`expr "${newProg}" : ".* -> \(.*\)$"`   
if expr "x${newProg}" : 'x/' >/dev/null; then    
   prog="${newProg}"     
else    
    progdir=`dirname "${prog}"`   
    prog="${progdir}/${newProg}"    
fi   
Run Code Online (Sandbox Code Playgroud)

shell-script expr

3
推荐指数
1
解决办法
1258
查看次数

仅将文件名的一部分转换为大写

在 shell 脚本程序中,如果转换后的文件名不存在,我需要将文件名转换为大写。在这种特殊情况下,我只需要将基本名称更改为大写,将扩展名(如果有)保持原样。

我做这个问题的想法是首先分别提取基名和扩展名,使用tr命令将基名转换为大写 ,然后检查目录中是否存在更改的基名和扩展名。

如果它不存在,那么我将使用 mv 用大写的基本名称更改原始文件名。现在我认为这可以通过两种方式完成:首先使用expr,其次使用cutwith .(space-period-space) 作为分隔符。

如果我想expr用于提取基本名称(例如,从文件名 -python1.pyphonelist),那么我写了这个:

basefile=`expr "$filename" : '\(.*\)\.*.*' ` 
Run Code Online (Sandbox Code Playgroud)

我也使用\.*了那些没有任何扩展名的文件名,因为\.* 会忽略零次或多次出现的.,但是这个表达式expr不能正常工作。对于任何文件名,它都按原样返回整个文件名。

任何人都可以请解释我错在哪里。另外请建议我如何使用expr仅从文件名中提取扩展名。

shell bash filenames regular-expression expr

3
推荐指数
1
解决办法
888
查看次数

将变量设置为除法和减法命令的结果

我试图以纪元形式获取 2 个日期的差异,并将数字转换回天数:

EXPIRYEPOCH=$(date --date="$EXPIRYDATE" +%s)
TODAYEPOCH=$(date --date="$TODAYSDATE" +%s)
DAYSLEFT=$(expr ($EXPIRYEPOCH - $TODAYEPOCH) / 86400 )
Run Code Online (Sandbox Code Playgroud)

上面的计算DAYSLEFT失败 - 而下面的减法的单个计算成功:

DAYSLEFT=$(expr $EXPIRYEPOCH - $TODAYEPOCH)
Run Code Online (Sandbox Code Playgroud)

用于设置DAYSLEFT变量(先减后除)的正确格式是什么?

bash expr

3
推荐指数
1
解决办法
2283
查看次数

了解 expr 实用程序的正则表达式匹配功能

谁能帮助我了解正则表达式匹配如何与该expr实用程序配合使用?我已阅读其手册页,下面是摘录:

STRING : REGEXP
  anchored pattern match of REGEXP in STRING
Run Code Online (Sandbox Code Playgroud)

但我不明白它是如何工作的。我做了一些测试:

[root@192 ~]# expr "abc" : '.*'
3
[root@192 ~]# expr "abc" : 'b.*'
0
[root@192 ~]#
Run Code Online (Sandbox Code Playgroud)

expr这两个命令在做什么?对于第一个命令,似乎expr从第一个字符找到了匹配项abc并报告了匹配的长度。但为什么它会产生0第二个命令呢?我只是不明白这里的逻辑。

顺便说一句,我知道正则表达式是如何工作的。

expr

3
推荐指数
1
解决办法
216
查看次数

使用 expr 进行算术运算

我正在做添加操作

#!/bin/sh
a=10
b=20
c='expr $a + $b'
echo "$c"
echo "$a"
echo "$b"
Run Code Online (Sandbox Code Playgroud)

但它显示输出为

expr $a + $b
10
20
Run Code Online (Sandbox Code Playgroud)

expr 有什么问题

shell-script quoting expr

2
推荐指数
1
解决办法
1799
查看次数

使用 expr 提取子串

我正在从字符串的开头和结尾提取子字符串。我尝试了和没有“.*”

$expr "ab1cd1efgfedcbaAAAA" : ".*\(1[a-l]*\)"  # Result: 1efgfedcba

$expr "ab1cd1efgfedcbaAAAA" : "\(1[a-l]*\)"    # No Result (1cd was expected)

$expr "ab1cd1efgfedcbaAAAA" : "\(ab1[a-l]*\)"    # Result: ab1cd
Run Code Online (Sandbox Code Playgroud)

为什么“expr”没有给出第二个子字符串搜索的结果。

可以看出,在第三次搜索中,'ab' 已被添加到子字符串的前缀。这是第二次和第三次搜索之间的唯一区别。也许我在这里遗漏了一些东西。

'expr' 是如何进行搜索的?

shell-script regular-expression expr

1
推荐指数
1
解决办法
2044
查看次数

awk 算术不同于 expr

awk 算法和 expr 之间有一些对比输出。

例子

expr 11111111111111111111 / 22
Run Code Online (Sandbox Code Playgroud)

505050505050505050
Run Code Online (Sandbox Code Playgroud)

但是使用 awk:

echo '11111111111111111111' | awk '{q=$1/22;;print q}'
Run Code Online (Sandbox Code Playgroud)

505050505050505024
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?

awk arithmetic expr

1
推荐指数
1
解决办法
684
查看次数