使用";“杜”;用于shell脚本中的数学(需要去掉后缀)

使用";“杜”;用于shell脚本中的数学(需要去掉后缀),shell,bc,du,Shell,Bc,Du,我有这个密码 strg=`du -s -BM /path/folder` dstrg=5120 num=`expr $dstrg -$strg` num1=`echo $num\* 100 |bc` num2=`echo $num1/5120 |bc` echo $num2 我得到变量strg,文件夹使用率为mb,然后 我想使用它将其从5gb的可用空间中删除 但是我得到了语法错误如果整数结果足够,您甚至不需要bc——而且在任何情况下都不建议将expr用于现代shell: #!/usr/bi

我有这个密码

strg=`du -s -BM /path/folder` 
dstrg=5120 
num=`expr $dstrg -$strg`
num1=`echo $num\* 100 |bc`
num2=`echo $num1/5120 |bc`
echo $num2
我得到变量strg,文件夹使用率为mb,然后 我想使用它将其从5gb的可用空间中删除
但是我得到了语法错误

如果整数结果足够,您甚至不需要
bc
——而且在任何情况下都不建议将
expr
用于现代shell:

#!/usr/bin/env bash
#              ^^^^- ensure that bash extensions are available

declare -- strg=$'4096M\t/path/folder'  # possible result of strg=$(du -s -BM /path/folder)

strg=${strg%%M*}   # delete everything after the first M in the string, inclusive

dstrg=5120

num=$(( ( (dstrg - strg) * 100) / 5120 ))
echo "$num"
…正确发射
20
作为输出


见:

  • --在
    ${strg%%M*}
    中使用的语法。另请参见,概述bash中的字符串操作
  • --描述
    $(())
    ,现代语法(适用于与1991年POSIX sh标准兼容的所有shell)取代
    expr

如果整数结果足够,您甚至不需要
bc
——而且在任何情况下都不建议将
expr
用于现代Shell:

#!/usr/bin/env bash
#              ^^^^- ensure that bash extensions are available

declare -- strg=$'4096M\t/path/folder'  # possible result of strg=$(du -s -BM /path/folder)

strg=${strg%%M*}   # delete everything after the first M in the string, inclusive

dstrg=5120

num=$(( ( (dstrg - strg) * 100) / 5120 ))
echo "$num"
…正确发射
20
作为输出


见:

  • --在
    ${strg%%M*}
    中使用的语法。另请参见,概述bash中的字符串操作
  • --描述
    $(())
    ,现代语法(适用于与1991年POSIX sh标准兼容的所有shell)取代
    expr

我忘了把它放在这里,我把它放在我的shell脚本中。顺便说一句,通常应该使用
$(())
而不是
expr
。由于
expr
是一个外部命令,因此运行它比shell内部数学要昂贵得多。是的,很抱歉,我忘了把它放在这里,我把它放在shell脚本中了。顺便说一句,一般来说,应该使用
$(())
而不是
expr
。由于
expr
是一个外部命令,因此运行它比shell内部数学要昂贵得多。是的,很抱歉,我的问题为什么
strg=${strg%M}
还不够?@karakfa,请查看此答案第一行编辑的硬编码示例输出-
du
的输出包含目录名(我们不能保证目录名本身不会包含
M
)。
${strg%%M*}
就足够了。在strg=${strg%%M}上使用2%或1%就可以了但是你能告诉我怎么在M之后删除所有内容吗?包括这个或者给我发一个链接,因为我只是想找到这个解决方案days@AndreasXatziosHadjiconstanti,您需要两个,否则如果文件名中有
M
,它会出现错误。请阅读“参数扩展”链接。这也是一个有用的资源。为什么
strg=${strg%M}
du还不够?@karakfa,请参见此答案第一行编辑的硬编码示例输出——至少在我测试的地方,
du
的输出包含目录名(我们不能保证目录名本身不会包含
m
)。
${strg%%m*}
可能就足够了。在strg=${strg%%M}上使用2%或1%就可以了。但是你能解释一下,在M之后删除所有内容的行是如何包含此内容的,还是向我发送链接,因为我只是想找到此解决方案2days@AndreasXatziosHadjiconstanti,您需要两个文件名,否则如果文件名中有
M
,则会出现问题。请阅读“参数扩展”链接。也是一个有用的资源。