比较shell中带有单位后缀的变量

qhhrdooz  于 2022-11-16  发布在  Shell
关注(0)|答案(1)|浏览(116)

我需要一个帮助在下面她会脚本
假设我们有两个变量,它们将动态地获取大小为es kb me gb的值
Var1 = 25 mb,它可以是任何大小,以字节、kb、mb或gb为单位
Var2 = 1 gb它可以是任何大小,以字节、kb、mb或gb为单位
现在我需要比较这些值,如果var1的大小小于var2的大小,则继续,否则输出。
请帮助我对bash脚本非常陌生
我是新来的shell不知道如何写这个

vlurs2pr

vlurs2pr1#

匹配前缀,适当相乘。请参见运行在https://ideone.com/YC1ghB的此命令

#!/usr/bin/env bash
size_re='^[[:space:]]*([[:digit:]]+)[[:space:]]*([kmg])b?[[:space:]]*$'

declare -A multipliers=(
  [k]=$(( 1024 ))
  [m]=$(( 1024 * 1024 ))
  [g]=$(( 1024 * 1024 * 1024 ))
)

to_bytes() {
  result=$1
  if [[ $1 =~ $size_re ]] && { units=${BASH_REMATCH[2]}; [[ $units && ${multipliers[$units]} ]]; }; then
    result=$(( ${BASH_REMATCH[1]} * ${multipliers[${BASH_REMATCH[2]}]} ))
  elif (( $1 )); then
    result=$(( $1 ))
  else
    echo "ERROR: $1 could not be parsed as a number" >&2
    return 1
  fi
  echo "$result"
}

Var1='25 MB'
Var2=1G
Var1_bytes=$(to_bytes "${Var1,,}") || exit
Var2_bytes=$(to_bytes "${Var2,,}") || exit
if (( Var1_bytes > Var2_bytes )); then
  echo "Var1 is larger than Var2"
else
  echo "Var1 is not larger than Var2"
fi

相关问题