2017-12-01 20 views
1

私はこのコード(接尾辞を除去する必要があります)

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変数に取得し、 を5GBている利用可能なスペースから削除するためにそれを使用しますが、整数結果が足りる場合、私は、構文エラー

+0

私はシェルスクリプトに入れました –

+0

一般に、 'expr'の代わりに' $(()) 'を使うべきです。 'expr'は外部コマンドであるので、シェル内部の数学よりも実行するのがはるかに高価です。 –

+0

はい残念私の悪い –

答えて

0

を持って、あなたもbcを必要としない - とどのような状況にexprは、近代的なシェルで使用するために助言されます。

#!/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を正しく出力します。


参照:

  • Parameter expansion - ${strg%%M*}で使用する構文。 BashFAQ #100も参照してください。一般的なbashの文字列操作について説明しています。
  • - $(())を記述すると、exprの代わりに現代の構文(1991 POSIX sh標準と互換性があるすべてのシェル用)。
+0

なぜ 'strg = $ {strg%M}'で十分ではありませんか? – karakfa

+0

@karakfaは、この解答の最初の行のハードコードされたサンプル出力を編集したものを参照してください - 少なくとも私がテストしているところでは、 'du'の出力にはディレクトリ名が含まれています(そして、それ自身は 'M 'を含む)。しかし、$ {strg %% M *} 'でも十分です。 –

+0

strg = $ {strg %% M}で2%または1%で動作しますが、Mがこれを含むか、リンクの原因を送信した後、その行をすべて削除する方法を教えてください2 days –

関連する問題