「+10」などの「デルタ」パラメータを確認する方法

「+10」などの「デルタ」パラメータを確認する方法

絶対整数値(0-100)または「+10」または「-50」などの相対的な「増分」である可能性がある数値をbashスクリプトに渡したいと思います。

または、チェックして残りの$1テキストを値として持つようにどのように解析しますか?+-

答え1

${var:offset:length}必要に応じて、変数の一部を抽出して結果を比較するために使用できます。このlength部分を省略すると、オフセットで始まる文字列の残りの部分が使用されます。

if [[ ${1:0:1} == "+" ]]; then
    is_negative=false
    is_delta=true
    arg=${1:1}
elif [[ ${1:0:1} == "-" ]]; then
    is_negative=true
    is_delta=true
    arg=${1:1}
else
    is_negative=false
    is_delta=false
    arg=$1
fi

答え2

これを行う秘訣があります。

sign=`echo $1|sed -e 's/[0-9]//g'`;
 num=`echo $1|sed -e 's/[+-]//g'`;
echo $sign;  # gets + - or empty
echo $num;   # gets the number

sed -e 's/[0-9]//g'すべての数字を削除して+ - 維持

sed -e 's/[+-]//g'+ - 削除、数字を保持

0、+0、-0を含むすべての状況に適用されます。

答え3

@framsのアイデアに応じて、答えを短くすることができます。

sign=${1//[[:digit:]]}
value=${1//[^[:digit:]]}

${1//[[:digit:]]}数値部分の削除${1}

${1//[^[:digit:]]}数値以外の部分を削除${1}

参考資料:メンデルクーパーの「高度なバッシュスクリプトガイド」

答え4

${var:offset:length}Bashの場合は、次の構文を使用します。パトリックの回答しかし、他のアプローチを使用します。まず、基本値を計算する必要があります。

たとえば、(値は現在の時間に基づいて)、次のようになります。

[[ "$1" =~ ^[+-]?(0|[1-9][0-9]*)$ ]] || exit 2

base="$(date +"%-H")"

case "${1:0:1}" in
"+")
    value="${1:1}"                                                                                                                 
    value=$((base + value))
    ;;
"-")
    value="${1:1}"                                                                                                                 
    value=$((base - value))
    ;;
*)
    value="$1"
    ;;
esac

((value < 0)) || ((value > 23)) && exit 2

echo "Task planned for ${value}h"

関連情報