我对在 Bash 中更好地实现“反向符号”功能很感兴趣。我知道我可以这样做:
"$(($1 * -1))"
Run Code Online (Sandbox Code Playgroud)
但这会产生一个没有符号的正数,但我需要有符号的返回值:
"$((-1 * -1))" == 1 # but I need '+1'
Run Code Online (Sandbox Code Playgroud)
我目前的版本是:
# Reverts the +/- operators for an integer argument.
#
# $ polarize -1 # +1
# $ polarize +12 # -12
# $ polarize 2-2 # 2-2
# $ polarize - 1 # - 1
#
function polarize() {
[ $# -eq 0 ] && return
if [[ "$@" =~ ^-([[:digit:]]+)$ ]]; then
echo -n "+${BASH_REMATCH[1]}"
elif [[ "$@" =~ ^\+([[:digit:]]+)$ ]]; then
echo -n "-${BASH_REMATCH[1]}"
else
echo -n "$@"
fi
}
Run Code Online (Sandbox Code Playgroud)
一些注意事项:
-1, +22,但不处理0or 100)使用printf:
printf '%+d\n' "$(( -$n ))"
Run Code Online (Sandbox Code Playgroud)
该printf格式串%+d的意思是“打印给定的参数为十进制整数,符号”。
所以你会得到类似的东西
printf '%+d\n' "$(( -$n ))"
Run Code Online (Sandbox Code Playgroud)
当给定多个参数或给定一个不是有符号整数的单个参数时,这不会做任何事情。
当有多个参数或单个参数不是带符号的整数时传递参数:
revsign () {
if [ "$#" -eq 1 ] && [[ $1 =~ ^[+-][[:digit:]]+$ ]]; then
printf '%+d\n' "$(( -$1 ))"
fi
}
Run Code Online (Sandbox Code Playgroud)
如果您想小心并且不接受八进制数(以 开头0,如在 中034)作为有效整数,请将正则表达式更改为
^[+-][1-9][[:digit:]]*$
Run Code Online (Sandbox Code Playgroud)