我想通过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
答案 0 :(得分:14)
您可以选择${var#-}
。
${var#Pattern}
从$var
中删除与$Pattern
前端匹配的$var
的最短部分。 tdlp
示例:
s2=5; s1=4
s3=$((s1-s2))
echo $s3
-1
echo ${s3#-}
1
答案 1 :(得分:5)
$ s2=5 s1=4
$ echo $s2 $s1
5 4
$ res= expr $s2 - $s1
1
$ echo $res
第四行实际发生的事情是res
被设置为空并导出expr
命令。因此,当您运行时[ "$res" -lt 0 ]
res
正在扩展为空,您会看到错误。
您可以使用arithmetic expression:
$ (( res=s2-s1 ))
$ echo $res
1
算术上下文保证结果将是一个整数,所以即使你的所有术语都未定义,你也会得到一个整数结果(即零)。
$ (( res = whoknows - whocares )); echo $res
0
或者,你可以通过声明它来告诉shell res
是一个整数:
$ declare -i res
$ res=s2-s1
这里有趣的是,作业的右侧是在算术上下文中处理的,所以你不需要$
进行扩展。
答案 2 :(得分:0)
我知道这个线程在这一点上已经很老了,但是我想分享我编写的一个函数可以对此有所帮助:
abs() {
[[ $[ $@ ] -lt 0 ]] && echo "$[ ($@) * -1 ]" || echo "$[ $@ ]"
}
这将以任何数学/数字表达式作为参数并返回绝对值。例如:abs -4 => 4或abs 5-8 => 3
答案 3 :(得分:0)
一种解决方法:尝试消除负号。
x=-12
x=$( sed "s/-//" <<< $x )
echo $x
12
x=-12
[[ ${x:0:1} = '-' ]] && x=${x:1} || :
echo $x
12
此语法为ternary opeartor。冒号':'是do-nothing指令。
就我个人而言,当我以string
开始时,对我而言脚本编写bash显得更容易。