Сценарий Bash с помощью вывода монтирования как переменная бросает многочисленные ошибки

Сервер Ubuntu 18.04 + LXDE. Я не могу приобрести навык этих сценариев удара.
Это - мой сценарий, "запускаются" (с нумерации строк):

#!/bin/bash
reply=sudo mount 192.168.0.2:/home/dk/NFS /home/dk/NFS
if $reply == 0
then 
    echo "NFS mounted OK"
else 
    echo "Mounting NFS failed: $reply"
fi

reply=sudo mount LABEL="60GB" /home/dk/60GB
if $reply == 0
then 
    echo "60GB mounted OK"
else 
    echo "Mounting 60GB failed: $reply"
fi
exit 0

Это - результат выполнения его:

$ ./scripts/start
mount: only root can do that
./start: line 3: ==: command not found
Mounting NFS failed: 
mount: only root can do that
./start: line 11: ==: command not found
Mounting 60GB failed: 
$ 
  • Почему это игнорировало sudo прежде mount?
  • Почему это не рассматривало if быть командой?
  • Почему это не распечатало (ненулевое) значение $reply?
4
задан 31 October 2018 в 05:44

3 ответа

Хорошо Вы присваиваете вывод команды неправильно. Должен быть:

reply=$(sudo mount 192.168.0.2:/home/dk/NFS /home/dk/NFS)

Это назвало замену команды. Иногда Вы видите его в старом синтаксисе Оболочки Bourne с одинарными левыми кавычками вместо $(...), но это не рекомендуется в наше время, потому что одинарные левые кавычки не могут быть вложены легко, в то время как можно сделать вложенный $( cmd1 $(cmd2))

Почему это не рассматривало, быть ли команда?

Если операторы воздействуют на команды, но что Вы даете, является переменным $reply, который только существует временно (см. позже в ответе о том), таким образом, он существует только для mount среда команды, но оболочка, запускающая скрипт, не знает ничего из него - это не существует. Сравнить строковое использование [, и да это - команда, также известная как test. Сделайте

if test "$reply" == 0

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

Но если Вы хотите проверить статус выхода команды, просто сделайте

if mount 192.168.0.2:/home/dk/NFS /home/dk/NFS

Посмотрите нет sudo? Поэтому это обычно избыточно для использования sudo в сценарии многократно. Просто назовите сам сценарий с sudo, и все команды будут иметь полномочие пользователя root.

Я также сказал бы, что эхо избыточно, потому что монтируют, что команда уже может распечатать ошибки к терминалу, но если Вы хотите пользовательское сообщение, можно сделать

if mount 192.168.0.2:/home/dk/NFS /home/dk/NFS 1> /dev/null
then
       echo "Success"
else
       echo "Fail"
fi

Из-за 1> нормальный вывод подавлен (на самом деле перенаправленный к /dev/null специально для той цели), но ошибки покажут, идет ли что-нибудь не так, как надо.

Почему это игнорировало "sudo", прежде чем "смонтируются"?

Что касается того, почему Вы получаете сообщение об ошибке поэтому форма

reply=sudo mount 192.168.0.2:/home/dk/NFS /home/dk/NFS

рассматривается как envvariable=value command arg1 arg2, т.е. Вы помещаете переменную result со значением sudo в среду mount команда. Команда будет знать об этом, но после выходов команды - переменной не стало также.

Почему это не распечатало (ненулевое) значение $reply?

Поскольку reply не хранит статус выхода, как объяснено прежде. Уже существует на самом деле переменная для обеспеченного оболочкой, $? так использование, что как

if [ $? -eq 0 ] 

Промойте и повторите предложения для других операторов в Вашем сценарии.

Удачи

11
ответ дан 23 November 2019 в 11:35

В дополнение к хорошему ответу Sergiy Вы могли рассмотреть использование И и ИЛИ списки, чтобы быстро проверить, возвращает ли команда статус выхода нуля, за которым (следуют) или нет, например

command && echo "command succeeded" || echo "command failed"

Вот выборка от man bash:

И и ИЛИ списки являются последовательностями одного или нескольких конвейеров, разделенных && и || операторы управления, соответственно. И и ИЛИ списки выполняются с левой ассоциативностью. И список имеет форму

      command1 && command2

command2 выполняется, если, и только если, command1 возвращает статус выхода нуля.

ИЛИ список имеет форму

      command1 || command2

command2 выполняется, если и только если command1 возвращает ненулевой статус выхода. Статус возврата И и ИЛИ списки является статусом выхода последней команды, выполняемой в списке.

Вы могли объединить их и также видеть статус выхода, если Вы хотите с Вашим примером как:

sudo mount 192.168.0.2:/home/dk/NFS /home/dk/NFS && \
echo "NFS mounted OK" || echo "Mounting NFS failed: $?"
7
ответ дан 23 November 2019 в 11:35

Проблемы с Вашим сценарием:

  • Вы отсутствовали ` для sudo mount .. команда. Для выполнения команды необходимо поместить его одинарные левые кавычки `command` или $(command). Можно получить возвращаемое значение использования сценария $? также.
  • Если конструкция цикла была неправильной

    if [ $var -eq/-lt/-gt "string"/number ]
    then
    echo "...."
    else
    echo "..."
    fi; <=== Most users miss this.
    

** Отредактированный сценарий **

#!/bin/bash

reply=`sudo mount 192.168.0.2:/home/dk/NFS /home/dk/NFS`

if [ $reply -eq "0" ]
then 
echo "NFS mounted OK"
else 
echo "Mounting NFS failed: $reply"
fi;

reply=`sudo mount LABEL="60GB" /home/dk/60GB`
if[ $reply -eq "0" ]
then 
    echo "60GB mounted OK"
else 
    echo "Mounting 60GB failed: $reply"
fi;
exit 0
0
ответ дан 23 November 2019 в 11:35

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

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