首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Bash脚本中计算kb,mb,gb,b的实际值

如何在Bash脚本中计算kb,mb,gb,b的实际值
EN

Stack Overflow用户
提问于 2022-04-17 14:07:24
回答 2查看 367关注 0票数 1

我想将所有kb,mb,gb,b的值转换为实际字节,例如,“10 kb”应该转换为"10240“字节。

下面是测试函数:

代码语言:javascript
运行
复制
#! /bin/bash

get_value_in_bytes()
{
    local value="$1"
    
    local unit_length=0
    local number_length=0
    local number=0
    
    if [[ "$value" == *"gb" ]]
    then
        unit_length=2
        number_length=$((${#value} - $unit_length))
        number=$((${value:0:$number_length})) * 1024 * 1024 * 1024 || -1
    elif [[ "$value" == *"mb" ]]
    then
        unit_length=2
        number_length=$((${#value} - $unit_length))
        number=$((${value:0:$number_length}))*1024*1024 || -1
    elif [[ "$value" == *"kb" ]]
    then
        unit_length=2
        number_length=$((${#value} - $unit_length))
        number=$((${value:0:$number_length}))*1024 || -1
    elif [[ "$value" == *"b" ]]
    then
        unit_length=1
        number_length=$((${#value} - $unit_length))
        number=$((${value:0:$number_length})) || -1
    else
        number=$((${value:0:$number_length})) || -1
    fi
    
    if (( $number < 0 ))
    then
        echo "error : $value"
    else
        echo "$number : $value"
    fi
}

下面是一个测试:

代码语言:javascript
运行
复制
get_value_in_bytes 10kb
get_value_in_bytes 10mb
get_value_in_bytes 10gb
get_value_in_bytes 10b
get_value_in_bytes 10
get_value_in_bytes not_number_mb
get_value_in_bytes not_number_gb

这是输出:

代码语言:javascript
运行
复制
10*1024 : 10kb
10*1024*1024 : 10mb
./test.sh: line 15: test.sh: command not found
./test.sh: line 15: -1: command not found
0 : 10gb
10 : 10b
0 : 10
0*1024*1024 : not_number_mb
./test.sh: line 15: test.sh: command not found
./test.sh: line 15: -1: command not found
0 : not_number_gb

我希望这个函数可以接受任何值作为输入,如果值不是数字字符串,则将其转换为-1。但是上面的函数并没有像预期的那样工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-17 14:39:54

下面是一个基于based和case语句的解决方案:

代码语言:javascript
运行
复制
get_value_in_bytes() {
    local bytes=-1
    if [[ $1 =~ ^([[:digit:]]+)(b|kb|mb|gb)?$ ]]
    then
        bytes=${BASH_REMATCH[1]}
        case ${BASH_REMATCH[2]} in
            kb) bytes=$((bytes * 1024)) ;;
            mb) bytes=$((bytes * 1048576)) ;;
            gb) bytes=$((bytes * 1073741824)) ;;
        esac
    fi
    printf '%s\n' "$bytes"
}

备注:

  • Shell算法只能处理整数。对于浮点计算,您必须使用像bc.

这样的外部工具

  • b部门是bit的。当你指的是byte.

时,你应该使用B

  • 撇开:基于2^10的单位是KiB MiB GiB
票数 2
EN

Stack Overflow用户

发布于 2022-04-17 16:34:55

作为一个例子,使用Bash的regex并不总是必要的;下面是只使用POSIX-shell语法重写的Fravadona's answer

代码语言:javascript
运行
复制
#!/usr/bin/env sh

toBytes() {
  digits=${1%%[^[:digit:]]*}
  unit=${1##*[[:digit:] ]}
  case $unit in
    kb) bytes=$((digits * 1024)) ;;
    mb) bytes=$((digits * 1048576)) ;;
    gb) bytes=$((digits * 1073741824)) ;;
    b | '') bytes=$((digits)) ;;
    *) bytes=-1 ;;
  esac
  printf '%s\n' "$bytes"
}

for s in 10kb 10mb 10gb 10b 10 not_number_mb not_number_gb; do
  toBytes "$s"
done
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71902566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档