expr
似乎不喜欢括号(在数学中用于显式运算符优先级):
expr 3 * (2 + 1)
bash: syntax error near unexpected token `('
Run Code Online (Sandbox Code Playgroud)
如何在bash中表达操作员优先级?
在 shell 脚本中,我们可以expr $a*$b
用$(($a+$b))
.
但为什么不只是 with (($a+$b))
,因为在任何资源中,它(())
都是为整数计算而编写的。
所以我们$(())
在有变量而不是整数值时使用,是吗?$(())
当变量可以接收浮点值时,我们应该使用什么来代替?
我有 bash 线:
expr substr $SUPERBLOCK 64 8
Run Code Online (Sandbox Code Playgroud)
这是返回给我的字符串行:
00080000
Run Code Online (Sandbox Code Playgroud)
我知道这实际上是小端的 0x00080000。有没有办法在像 0x80000 这样的 big-endian 中的 bash 中从它创建整数变量?
下面具体做了什么?
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 脚本程序中,如果转换后的文件名不存在,我需要将文件名转换为大写。在这种特殊情况下,我只需要将基本名称更改为大写,将扩展名(如果有)保持原样。
我做这个问题的想法是首先分别提取基名和扩展名,使用tr
命令将基名转换为大写
,然后检查目录中是否存在更改的基名和扩展名。
如果它不存在,那么我将使用 mv 用大写的基本名称更改原始文件名。现在我认为这可以通过两种方式完成:首先使用expr
,其次使用cut
with .
(space-period-space) 作为分隔符。
如果我想expr
用于提取基本名称(例如,从文件名 -python1.py
或phonelist
),那么我写了这个:
basefile=`expr "$filename" : '\(.*\)\.*.*' `
Run Code Online (Sandbox Code Playgroud)
我也使用\.*
了那些没有任何扩展名的文件名,因为\.*
会忽略零次或多次出现的.
,但是这个表达式expr
不能正常工作。对于任何文件名,它都按原样返回整个文件名。
任何人都可以请解释我错在哪里。另外请建议我如何使用expr
仅从文件名中提取扩展名。
我试图以纪元形式获取 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
变量(先减后除)的正确格式是什么?
谁能帮助我了解正则表达式匹配如何与该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
第二个命令呢?我只是不明白这里的逻辑。
顺便说一句,我知道正则表达式是如何工作的。
我正在做添加操作
#!/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 有什么问题
我正在从字符串的开头和结尾提取子字符串。我尝试了和没有“.*”
$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' 是如何进行搜索的?
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)
有人可以解释一下吗?
expr ×10
bash ×4
shell-script ×4
arithmetic ×2
quoting ×2
shell ×2
awk ×1
filenames ×1
hex ×1
numeric-data ×1