在 Bash 中更好地实现反向符号

ser*_*hei 0 bash shell-script

我对在 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
  • 如果没有参数,函数不应返回任何内容
  • 函数应该正确处理多个参数(不要做任何事情)

Kus*_*nda 6

使用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)