我想通过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
Run Code Online (Sandbox Code Playgroud)
现在我遇到的问题是在if语句中,无论我改变什么,它总是在if中,我试图放置[[ ]]声明但没有.
这是错误:
./p6.sh: line 13: [: : integer expression expected
Run Code Online (Sandbox Code Playgroud)
Suu*_*hgi 21
你可能会采取${var#-}.
${var#Pattern}从$var最短的部分移除$Pattern匹配的前端$var.tdlp
例:
s2=5; s1=4
s3=$((s1-s2))
echo $s3
-1
echo ${s3#-}
1
Run Code Online (Sandbox Code Playgroud)
小智 7
我知道这个线程在这一点上已经很老了,但我想分享一个我写的可以帮助解决这个问题的函数:
abs() {
[[ $[ $@ ] -lt 0 ]] && echo "$[ ($@) * -1 ]" || echo "$[ $@ ]"
}
Run Code Online (Sandbox Code Playgroud)
这将采用任何数学/数字表达式作为参数并返回绝对值。例如: abs -4 => 4 或 abs 5-8 => 3
$ s2=5 s1=4
$ echo $s2 $s1
5 4
$ res= expr $s2 - $s1
1
$ echo $res
Run Code Online (Sandbox Code Playgroud)
第四行实际发生的是将res其设置为空并为expr命令导出.因此,当您运行[ "$res" -lt 0 ] res扩展为空时,您会看到错误.
你可以使用算术表达式:
$ (( res=s2-s1 ))
$ echo $res
1
Run Code Online (Sandbox Code Playgroud)
算术上下文保证结果是一个整数,所以即使你的所有术语都是未定义的,你也会得到一个整数结果(即零).
$ (( res = whoknows - whocares )); echo $res
0
Run Code Online (Sandbox Code Playgroud)
或者,你可以res通过声明它来告诉shell 是一个整数:
$ declare -i res
$ res=s2-s1
Run Code Online (Sandbox Code Playgroud)
这里有趣的是,赋值的右侧在算术上下文中被处理,因此您不需要$扩展.
| 归档时间: |
|
| 查看次数: |
33451 次 |
| 最近记录: |