Transmita strings para Inteiros e compare

0

Eu quero pegar o tamanho do arquivo em MB de um diretório e fazer coisas diferentes para tamanhos diferentes do diretório. Meu código é:

file_size_with_path=$(du -sb $file_path)
file_size=$(echo "$file_size_with_path" | tr -d -c 0-9)
echo "$file_size"
## if directory size is betweem 1GB and 10 GB:
if [[ ($file_size < 10737418240 ) && ($file_size > 1073741824 ) ]]; then   
    echo "yoyo1"
    block_size=$(($file_size/120))
    block_size_in_bytes=$(($block_size*1024))
    stripe_size_in_bytes=$((block_size_in_bytes/4))
## if directory size is greater than 10 GB
elif [[ ($file_size > 10737418240 ) ]] ; then
    echo "yoyo2"
    block_size_in_bytes="67108864"
    stripe_size_in_bytes=$((block_size_in_bytes/4))
##if directory size is less than 1 GB
elif [[ ($file_size < 1073741824 ) ]] ; then
    echo "yoyo3"
    block_size_in_bytes="16777216"
    stripe_size_in_bytes=$((block_size_in_bytes/4))
fi

O código, quando executado para um diretório de tamanho 3318222, entra no segundo bloco elo (isto é, imprime yoyo2), mas deve ter entrado no terceiro e impresso yoyo3. Alguém, por favor, sugira como converter as strings como inteiros e fazer uma comparação.

Eu tentei colocar aspas duplas em torno das variáveis e dos números, mas não funcionou. Eu olhei para outras respostas, mas temo que nada funcionou.

Obrigado.

    
por kskp 12.05.2017 / 23:34

2 respostas

3

Assumindo bash aqui.

Em vez de

if [[ ($file_size < 10737418240 ) && ($file_size > 1073741824 ) ]]

você pode usar

if (( file_size < 10737418240 )) && (( file_size > 1073741824 ))

O (( ... )) é uma avaliação aritmética na qual os nomes das variáveis serão interpretados como números inteiros e os operadores < , > etc. atuam como geralmente fazem em inteiros.

com

[[ $file_size < 10737418240 ]]

você está comparando duas strings na ordem de classificação da localidade atual (de acordo com $LC_COLLATE ).

    
por 12.05.2017 / 23:40
2

Ao usar bash testes em [[ ]] pares, use -gt e -lt para comparações numéricas 'maior que' e 'menor que'. < e > são usados para comparações de strings, nas quais [[ 1000000 < 90 ]] seria realmente verdadeiro.

    
por 12.05.2017 / 23:49