问题 数字的绝对值


我想通过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

6737
2018-03-24 01:12


起源

在计算$ res res =之后,一种更简单的方法是添加额外的行echo $res | tr -d - - prash


答案:


$ s2=5 s1=4
$ echo $s2 $s1
5 4
$ res= expr $s2 - $s1
1
$ echo $res

第四行实际发生的是那个 res 被设置为空,并出口为 expr 命令。因此,当你跑步 [ "$res" -lt 0 ]  res 正在扩展到什么都没有,你看到错误。

你可以使用一个 算术表达式

$ (( res=s2-s1 ))
$ echo $res
1

算术上下文保证结果将是一个整数,所以即使你的所有术语都未定义开始,你也会得到一个整数结果(即零)。

$ (( res = whoknows - whocares )); echo $res
0

或者,您可以告诉shell res 通过声明它是一个整数:

$ declare -i res
$ res=s2-s1

这里有趣的是,赋值的右侧在算术上下文中被处理,所以你不需要 $ 对于扩展。


5
2018-03-24 01:17



问题是如果 - Ali Sajid
@AliSajid没有, 错误 在 if。该 问题 在此之前 if,当你从未实际分配价值时 res。 - kojiro
abs $ res => ${res/#-/} :) - rici
@rici嘿。我想到了这一点,但由于OP说,因此将其排除在外 通过以下代码。但是啊...... - kojiro


你可能会采取 ${var#-}

${var#Pattern} 从...除去 $var 最短的部分 $Pattern 匹配前端 $vartdlp


例:

s2=5; s1=4
s3=$((s1-s2))

echo $s3
-1

echo ${s3#-}
1

7
2017-11-11 16:45



这非常适合获得正数 $(( 2**63 ))。 - ltrainpr