Bashでの逆表記のより良い実装

Bashでの逆表記のより良い実装

私はBashで「逆符号」機能をよりよく実装することに興味があります。私は次のことができることを知っています。

"$(($1 * -1))"

ただし、これは符号なし正の数を生成しますが、符号付き戻り値が必要です。

"$((-1 * -1))" == 1 # but I need '+1'

私の現在のバージョンは次のとおりです

# 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
}

いくつかの注意:

  • 関数は符号付き整数のみを処理する必要があります(たとえば、、、-1ORではありません+22)。0100
  • パラメータがない場合、関数は何も返さないでください。
  • 関数は複数の引数を正しく処理する必要があります(何もしません)。

ベストアンサー1

使用printf:

printf '%+d\n' "$(( -$n ))"

フォーマットprintf文字列は、%+d「与えられた引数を符号付き10進整数として印刷する」を意味します。

だからあなたは次のようなものを得るでしょう

revsign () {
    if [ "$#" -eq 1 ] && [[ $1 =~ ^[+-][[:digit:]]+$ ]]; then
        printf '%+d\n' "$(( -$1 ))"
    fi
}

複数の引数が与えられた場合、または符号付き整数以外の引数が与えられた場合は、何もしません。

引数が複数ある場合、または単一の引数が符号付き整数でない場合は、引数を渡します。

revsign () {
    if [ "$#" -eq 1 ] && [[ $1 =~ ^[+-][[:digit:]]+$ ]]; then
        printf '%+d\n' "$(( -$1 ))"
    elif [ "$#" -gt 0 ]; then
        printf '%s\n' "$@"
    fi
}

0注意して8進数(のようにで始まる)を有効な整数として受け入れたくない場合は、正規034表現を次のように変更してください。

^[+-][1-9][[:digit:]]*$

おすすめ記事