"+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}

참고 자료: 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"

관련 정보