Простой bash скрипт не работает

Настройте легкий DNS-сервер на своем raspberry (я рекомендую dnsmasq вместо «стандартного» сервера ISC BIND, потому что его проще настроить up для этой цели) и настройте его как DNS-сервер по умолчанию для любого устройства, подключенного к вашей локальной сети (скорее всего, в вашей конфигурации DHCP).

В конфигурации DNS укажите в своем домене локальный адрес 192.168.x.x, тем самым переопределив указатель глобального интернет-домена в вашей локальной сети. Настройте DNS для пересылки всех других запросов на соответствующий DNS-сервер за пределами вашей локальной сети (например, DNS вашего интернет-провайдера).

Это приведет к тому, что устройство LAN будет получать адрес локального сервера всякий раз, когда оно запрашивает ваш домен. Когда это устройство находится в пути, оно получит «настоящий» внешний IP-адрес от DNS-сервера за пределами вашей локальной сети.

2
03.06.2019, 17:00
3 ответа

readобъявляет переменные, а не читает их. Проще говоря, удалите $из read, и все готово.

if [ -z $1 ]
then
    echo provide filenames
    read FILENAMES
else
    FILENAMES="$@"
fi

echo the following filenames have been provided: $FILENAMES
for i in $FILENAMES
do
    cp $i $HOME
done

РЕДАКТИРОВАТЬ :Я вижу, что вы используете командуsource(.)для запуска скрипта.

[dmytro@oc1726036122 Desktop]$. totmp

Это может подойти для данного конкретного скрипта, но никогда не делайте этого для сложных скриптов. В противном случае вы загружаете любую переменную или функцию из этого скрипта в свою оболочку. Просто используйтеbash totmp

2
27.01.2020, 21:55

Команда readпринимает переменную, но вы уже ссылаетесь на значения переменной:

 #correct syntax
 read variable
 #wrong syntax
 read $variable

$variable— это значение variable, и в начале скрипта оно не установлено/пусто.

1
27.01.2020, 21:55

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

read FILENAMES

Еще одна проблема с проверкой отсутствия первого аргумента строки команды -. Если его нет, то $1превратится в ничто (, а не в пустую строку ), что может вызвать проблемы с командой [, поскольку [ -z ]на самом деле не предполагается допустимым, [ -z "" ]- это то, что вы ожидаете проверить в этом случае. Короче говоря, вам нужно указать эту переменную:

if [ -z "$1" ]

Поскольку вы используете bash, вы также можете использовать [[... ]], что обычно лучше, так как это внутренняя команда (в этом случае эта команда должна работать без кавычек, но сохранение кавычек не повредит и выглядит неплохо.)

(П.С. :В этом скрипте так много всего неправильного, он настолько далек от лучших практик, что я действительно потрясен тем, что кто-то учит этому. К сожалению,кажется, что планка для обучения bash очень низкая, а руководства действительно сложны, пока вы действительно не поймете это хорошо, поэтому я не знаю, могу ли я дать лучшую рекомендацию о том, как правильно его изучить.)☹️

2
27.01.2020, 21:55

Теги

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