我想在bash中通过下面的代码获取一个数字的绝对值:
#!/bin/bash
echo "Enter the first file name: "
read first
echo "Enter the second file name: "
read second
s1=$(stat --format=%s "$first")
s2=$(stat -c '%s' "$second")
res= expr $s2 - $s1
if [ "$res" -lt 0 ]
then
res=$res \* -1
fi
echo $res
字符串
现在我面临的问题是在if语句中,无论我改变什么,它总是在if中,我试图把[[ ]]
放在语句周围,但什么也没有。
以下是错误:
./p6.sh: line 13: [: : integer expression expected
型
9条答案
按热度按时间z0qdvdin1#
你可以只取
${var#-}
。${var#Pattern}
从$var
中删除与$var
前端匹配的$Pattern
的最短部分。tdlp示例如下:
字符串
b0zn9rqh2#
字符串
第四行实际发生的是
res
被设置为nothing并导出为expr
命令。因此,当您运行[ "$res" -lt 0 ]
时,res
将扩展为空,您将看到错误。你可以使用arithmetic expression:
型
算术上下文保证结果将是一个整数,所以即使所有的术语都是未定义的,你也会得到一个整数结果(即零)。
型
或者,您可以通过如下声明告诉shell
res
是一个整数:型
这里有趣的是,赋值的右边是在算术上下文中处理的,所以不需要
$
来进行扩展。fquxozlt3#
我知道这个线程在这一点上已经很老了,但我想分享我写的一个函数,可以帮助实现这一点:
字符串
这将接受任何数学/数值表达式作为参数,并返回绝对值。例如:abs-4 => 4或abs 5-8 => 3
rqmkfv5c4#
解决方法:试着去掉减号。
1.使用sed
字符串
1.用parameter expansion检查第一个字符
型
这个语法是ternary opeartor。冒号':'是do-nothing指令。
1.或者用“-”符号替换为空(再次参数扩展)
型
就个人而言,当我想到
string
-first时,脚本bash对我来说似乎更容易。67up9zun5#
我把this solution翻译成bash。我更喜欢它,而不是接受的字符串操作方法或其他条件,因为它将
abs()
过程保持在数学部分中字符串
yh2wf1be6#
对于纯粹主义者来说,假设
bash
和相对较新的一个(我在4.2和5.1上测试过):字符串
eyh26e7m7#
如果你不关心数学,只关心结果,你可以使用
字符串
ijnw1ujt8#
最简单的解决方案:
字符串
如果
-
位于第一个#
字符处,则仅删除一个/
匹配项。piah890a9#
这个简单的方法适用于浮点数:
第一个月