私は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
}
いくつかの注意:
- 関数は符号付き整数のみを処理する必要があります(たとえば、、、
-1
ORではありません+22
)。0
100
- パラメータがない場合、関数は何も返さないでください。
- 関数は複数の引数を正しく処理する必要があります(何もしません)。
ベストアンサー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:]]*$