Se declaração dentro de uma declaração de caso

0

Minha lógica é verificar se uma variável contém Floating point ou um Integer e, em seguida, postá-la se a variável estiver flutuando, em seguida, terá que arredondar o número para o mais próximo número maior e se é inteiro imprimir como é.

if echo "$FS" | grep "^[0-9]*$" > /dev/null
then
echo "Integer"
elif echo "FS" | grep "^[0-9]*[.][0-9]*$" > /dev/null
then
echo "Floating"
fi

Isso funciona perfeitamente, mas o problema surge quando eu integro isso na declaração de caso.

#!/bin/bash
IP_DIR=$1
ACTUAL=$2
typeset -l ACTUAL
RETURNSIZE=$3
typeset -l RETURNSIZE

if [ -d "$IP_DIR" ]; then
for OUTPUT in $(find $IP_DIR -maxdepth 1 | awk 'NR>1')
do
        if [ "$ACTUAL" == "true" ]; then
                case $RETURNSIZE in
                "gb") FS='du -b $OUTPUT | awk {'print $1'}'
                      FS=$(echo "scale=12; $FS  / 1073741824" | bc)
                      echo $OUTPUT "|" $FS "GB";;
                "mb") FS='du -b $OUTPUT | awk {'print $1'}'
                      FS='echo $FS | awk '{ byte =$1 /1024/1024 ; print byte " MB" }''
                      echo $OUTPUT "|" $FS;;
                "kb") FS='du -b $OUTPUT | awk {'print $1'}'
                      FS='echo $FS | awk '{ byte =$1 /1024 ; print byte " KB" }''
                      echo $OUTPUT "|" $FS;;
                "b")  FS='du -b $OUTPUT | awk {'print $1'}'
                      echo $OUTPUT "|" $FS "B";;
                "all")FS='du -h $OUTPUT | awk {'print $1'}'
                      echo $OUTPUT "|" $FS;;
                esac
        elif [ "$ACTUAL" == "false" ]; then
               case $RETURNSIZE in
                "gb") FS='du -b $OUTPUT | awk {'print $1'}'
                      FS=$(echo "scale=12; $FS  / 1073741824" | bc)
                      if [[ $FS == ^[0-9]*$ ]]; then echo $OUTPUT "|" $FS "GB" ;elif [[ $FS == ^[0-9]*[.][0-9]*$ ]]; then echo "$OUTPUT "|" $FS "GB round"; fi
                      ;;#echo $OUTPUT "|" $FS "GB Needed to be rounded";;
                "mb") FS='du -m $OUTPUT | awk {'print $1'}'
                      echo $OUTPUT "|" $FS "MB";;
                "kb") FS='du -k $OUTPUT | awk {'print $1'}'
                      echo $OUTPUT "|" $FS "KB";;
                "b")  FS='du -b $OUTPUT | awk {'print $1'}'
                      echo $OUTPUT "|" $FS "B";;
                "all")FS='du -h $OUTPUT | awk {'print $1'}'
                      echo $OUTPUT "|" $FS;;
                esac


        fi
done
else
echo "Directory Not Found"
fi

As mensagens de erro

.sh: linha 48: EOF inesperado ao procurar correspondência '' ' .sh: linha 50: erro de sintaxe: final inesperado do arquivo

    
por ramp 27.02.2017 / 20:00

2 respostas

2

Você tem vários problemas neste script.

O " ausente está na linha 31:

echo "$OUTPUT "|" $FS "GB round"

Você também usa awk {'print $1'} em vez de awk '{print $1}' .

Para obter uma lista completa de problemas sintáticos , passe o script em ShellCheck .

Também há várias coisas que podem ser feitas melhor, como descartar as várias chamadas para du -b $OUTPUT | awk {'print $1'} para apenas uma chamada (facilita a manutenção).

Você também não possui várias aspas duplas em torno de expansões variáveis.

    
por 27.02.2017 / 20:10
2

Vou ligar shellcheck.net , pois ajudou a responder isso. Queixou-se:

^-- SC1079: This is actually an end quote, but due to next char it looks suspect.

De fato, na linha 31, você tem:

if [[ $FS == ^[0-9]*$ ]]; then echo $OUTPUT "|" $FS "GB" ;elif [[ $FS == ^[0-9]*[.][0-9]*$ ]]; then echo "$OUTPUT "|" $FS "GB round"; fi

se terminarmos com a legibilidade, é:

if [[ $FS == ^[0-9]*$ ]]
then 
  echo $OUTPUT "|" $FS "GB"
elif [[ $FS == ^[0-9]*[.][0-9]*$ ]]
then 
  echo "$OUTPUT "|" $FS "GB round"
fi

... em que ponto é mais fácil ver que o último echo "$OUTPUT tem cotas desequilibradas.

    
por 27.02.2017 / 20:08