如何检查“delta”参数,例如“+10”

如何检查“delta”参数,例如“+10”

我想将一个数值传递给 bash 脚本,该数值可以是绝对整数值 (0-100) 或相对“增量”,如“+10”或“-50”。

我将如何解析$1以检查+or-并将剩余文本作为值?

答案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}

参考:Mendel Cooper 的《高级 Bash 脚本指南》

答案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"

相关内容