絶対整数値(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}
参考資料:メンデルクーパーの「高度なバッシュスクリプトガイド」
答え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"