Dan Asked: 2018-01-02 05:51:42 +0800 CST2018-01-02 05:51:42 +0800 CST 2018-01-02 05:51:42 +0800 CST 如何检查像“+10”这样的“delta”参数 772 我想将一个数值传递给 bash 脚本,它可以是绝对整数值 (0-100),也可以是相对的“增量”,如“+10”或“-50”。 我将如何解析$1以检查+或-获取剩余文本作为值? shell-script arguments 5 个回答 Voted nohillside 2018-01-02T05:57:20+08:002018-01-02T05:57:20+08:00 您可以使用${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 frams 2018-01-02T07:20:02+08:002018-01-02T07:20:02+08:00 有一个技巧可以做到这一点 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。 Best Answer harbinn 2018-01-02T08:18:53+08:002018-01-02T08:18:53+08:00 基于@frams 的想法,我们可以缩短答案: sign=${1//[[:digit:]]} value=${1//[^[:digit:]]} ${1//[[:digit:]]}删除数字部分${1} ${1//[^[:digit:]]}删除非数字部分${1} 参考: Mendel Cooper 的高级 Bash 脚本指南 ctac_ 2018-01-02T10:33:16+08:002018-01-02T10:33:16+08:00 使用 posix 外壳 unset -v sign value value="${1#[-+]}" if [ "$value" -eq "$value" 2> /dev/null ];then [ "$1" != "$value" ] && sign="${1%$value}" echo "sign = $sign value = $value" else echo "not a number $1" fi user285259 2018-01-02T16:22:35+08:002018-01-02T16:22:35+08:00 对于 Bash,我会使用${var:offset:length}类似patrix's answer中的语法,但使用另一种方法。你应该在之前计算你的基值。 例如(该值相对于当前小时): [[ "$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"
您可以使用
${var:offset:length}
提取变量的一部分并根据需要比较其结果。如果省略该length
部分,则将从偏移量开始的字符串的其余部分被取走。有一个技巧可以做到这一点
sed -e 's/[0-9]//g'
删除所有数字,+ - 保留sed -e 's/[+-]//g'
删除 + -,数字保留适用于所有情况,包括 0、+0、-0。
基于@frams 的想法,我们可以缩短答案:
${1//[[:digit:]]}
删除数字部分${1}
${1//[^[:digit:]]}
删除非数字部分${1}
参考: Mendel Cooper 的高级 Bash 脚本指南
使用 posix 外壳
对于 Bash,我会使用
${var:offset:length}
类似patrix's answer中的语法,但使用另一种方法。你应该在之前计算你的基值。例如(该值相对于当前小时):