Сценарии проблем - Неожиданный Конец использования Файла, ЕСЛИ/ЗАТЕМ

Наконец превращенный перемещение в Linux и решенный лучший способ знать досконально состоял в том, чтобы попробовать мои силы в сценариях.

Попытка сделать основное (запустил действительно основной и продолжает расти), сценарий, который автоматически монтирует или размонтировал разделы на основе ввода данных пользователем. Мысль я был на правильном пути, но не могу разработать то, что идет не так, как надо. Извинения заранее, если это - просто что-то действительно немое.

#!/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
1
задан 26 July 2016 в 01:51

2 ответа

Измените эту строку:

if [ $origin == unmount ]; then

к этому:

elif [ $origin == unmount ]; then

Вы получаете эту ошибку, потому что удар интерпретирует второе if столь же вложенный, вместо как второе условие. Вот визуализация с отступами.

if [ $origin == mount ]; then
  # Do some things.
  if [ $origin == unmount ]; then
    # Do some things.
  fi
#fi
<час>

Между прочим, необходимо также заключить переменные в кавычки для защиты от разделения слова и globbing:

if [ "$origin" == mount ]; then
    ...
    mount -t ntfs /dev/"$device" "$location"
elif [ "$origin" == unmount ]; then
    ...
    umount "$ulocation"
6
ответ дан 3 December 2019 в 06:21

wjandrea, кажется, покрыл if проблемы. Я предложил бы a 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

Это позволяет человеку запрашивать монтирование путем ввода mount или mo или даже просто m. Точно так же размонтирование можно требовать с ответом, столь же коротким как u. (Можно быть более строгими, если Вы хотите.) Далее, если пользователю не удается ответить чем-то приемлемым, его ругают и спрашивают снова.

Если Вы не хотите разделение слова и расширение пути, все переменные оболочки должны быть, как показано выше, в двойных кавычках.

Кроме того, для большей гибкости я не учел -t ntfs опция. mount может обычно автоматически выбирать правильный тип.

Преимущество использования case операторы для сопоставления с образцом по необычному сопоставлению с образцом удара с [[...]] это case POSIX и поэтому портативный.

3
ответ дан 3 December 2019 в 06:21

Другие вопросы по тегам:

Похожие вопросы: