2017-12-01 21 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 

내가 MB의 폴더 사용 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*}에 사용되는 구문. 또한 일반적으로 bash의 문자열 조작을 설명하는 BashFAQ #100을 참조하십시오.
  • Arithmetic expansion - $(())을 설명하고 expr을 대체하는 최신 구문 (1991 POSIX sh 표준과 호환되는 모든 셸)
+0

왜'strg = $ {strg % M}'이 충분하지 않습니까? – karakfa

+0

@karakfa,이 답변의 첫 번째 행에 하드 코드 된 샘플 출력이 표시되어 있습니다. - 적어도 테스트 할 곳에서는'du'의 출력에 디렉토리 이름이 포함되어 있습니다 (디렉토리 이름이 ' t 자체는'M '을 포함한다). 그러나 $ {strg %% M *}'는 충분할 수 있습니다. –

+0

은 strg = $ {strg %% M}에서 2 % 또는 1 %로 작동하지만, M이이를 포함하거나 링크를 보내면 어떻게 설명 할 수 있습니까? 그냥이 해결책을 찾으려고합니다. 2 일 –