我想将一个数值传递给 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"