Problemas de script - Fim de arquivo inesperado usando IF / THEN

0

Finalmente, decidi que a melhor maneira de aprender as cordas era tentar minha mão no script.

Tentando fazer um script básico (iniciado realmente básico e em constante crescimento) que automaticamente monta ou desmonta partições com base na entrada do usuário. Pensei que estava no caminho certo, mas não posso descobrir o que está errado. Desculpas de antemão se é algo realmente idiota.

#!/bin/bash
# Test script to auto mount hdd based in user input

echo "Do you wish to mount or unmount?"
read origin

if [ $origin == mount ]; then
    echo "Partitions : $(lsblk)"
    echo "Please enter device name e.g. sda1"
    read device
    echo "Please enter dir location e.g. /mnt"
    read location
    mount -t ntfs /dev/$device $location
if [ $origin == unmount ]; then
    echo "Mounts : $(mount)"
    echo "Please enter mount location e.g. /mnt"
    read ulocation
    umount $ulocation
fi
    
por Rob Oliver 25.07.2016 / 22:22

2 respostas

6

Altere esta linha:

if [ $origin == unmount ]; then

para isso:

elif [ $origin == unmount ]; then

Você está recebendo este erro porque bash está interpretando o segundo if como aninhado, em vez de como uma segunda condição. Aqui está uma visualização com recuos.

if [ $origin == mount ]; then
  # Do some things.
  if [ $origin == unmount ]; then
    # Do some things.
  fi
#fi

A propósito, você também deve citar suas variáveis para proteger contra a divisão de palavras e globbing:

if [ "$origin" == mount ]; then
    ...
    mount -t ntfs /dev/"$device" "$location"
elif [ "$origin" == unmount ]; then
    ...
    umount "$ulocation"
    
por wjandrea 26.07.2016 / 00:16
3

O wjandrea parece ter coberto os problemas de if . Sugiro uma declaração case :

#!/bin/bash
# Test script to auto mount hdd based in user input

while read -rp "Do you wish to mount or unmount? " origin
do
    case "$origin" in
        m*)
            echo "Partitions : $(lsblk)"
            read -rp "Please enter device name e.g. sda1: " device
            read -rp "Please enter dir location e.g. /mnt: " location
            mount "/dev/$device" "$location"
            break
            ;;
        u*)
            echo "Mounts : $(mount)"
            read -rp "Please enter mount location e.g. /mnt: " ulocation
            umount "$ulocation"
            break
            ;;
        *)
            echo "You typed nonsense.  Please try again."
            ;;
    esac
done

Isso permite que a pessoa solicite uma montagem digitando mount ou mo ou mesmo apenas m . Da mesma forma, uma desmontagem pode ser solicitada com uma resposta tão curta quanto u . (Você pode ser mais restritivo se quiser.) Além disso, se o usuário não responder com algo aceitável, ele é repreendido e perguntado novamente.

A menos que você deseje a divisão de palavras e a expansão do nome do caminho, todas as variáveis do shell devem ser, como mostrado acima, entre aspas duplas.

Além disso, para maior flexibilidade, deixei de fora a opção -t ntfs . mount geralmente pode selecionar automaticamente o tipo certo.

Uma vantagem de usar as declarações case para correspondência de padrões sobre correspondência de padrões bash extravagante com [[...]] é que case é POSIX e, portanto, portátil.

    
por John1024 26.07.2016 / 00:38