절대 정수 값(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"