使用";“杜”;用于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
作为输出
见:
- --在
中使用的语法。另请参见,概述bash中的字符串操作${strg%%M*}
- --描述
,现代语法(适用于与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
作为输出
见:
- --在
中使用的语法。另请参见,概述bash中的字符串操作${strg%%M*}
- --描述
,现代语法(适用于与1991年POSIX sh标准兼容的所有shell)取代$(())
expr
$(())
而不是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
,则会出现问题。请阅读“参数扩展”链接。也是一个有用的资源。