Как правильно вызвать функцию bash

Сейчас изучаю оболочку и написал небольшой скрипт для использования функций:

#!/bin/bash

show_date () {
  date;
}

show_ls () {
  ls -la;
}

if [ hostname == "mbp" ]; then
  show_ls;
elif [ hostname == "joe" ]; then
  show_date;
fi

Если я запустил его на имени хоста mbp, он просто выйдет с 0 и не вызовет функцию show_ls. Любые идеи?

Это не сработает, если ваше имя хоста - «joe». hostmame необходимо выполнить. Таким образом, он не будет выполняться внутри условия if. Попробуйте $(hostname) и прочтите некоторую документацию по оболочке, касающуюся скриптов.

lurker 23.06.2018 13:36

Спасибо! Это сработало!

J. Parmes 23.06.2018 13:38

Вам не нужно вызывать внешнюю программу hostname, в bash уже есть переменная, используйте $HOSTNAME.

cdarke 23.06.2018 13:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
74
2

Ответы 2

Если вы не хотите создавать свою собственную переменную для имени хоста, используйте следующее (встроенный Переменная Bash).

#!/bin/bash
show_date () {
  date;
}

show_ls () {
  ls -la;
}

if [[ $HOSTNAME = "mbp" ]]; then
  show_ls;
elif [[ $HOSTNAME = "joe" ]]; then
  show_date;
fi

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

#!/bin/bash
hostname=$(hostname)

show_date () {
  date;
}

show_ls () {
  ls -la;
}

if [[ "$hostname" = "mbp" ]]; then
  show_ls;
elif [[ "$hostname" = "joe" ]]; then
  show_date;
fi

Нет, это тот же выход 0 и нет вызова функции show_ls.

J. Parmes 23.06.2018 13:37

@ J.Parmes, поэтому, возможно, ни одно из условий не выполняется для вашего текущего хоста (потому что команда hostname примет имя текущего сервера), потому что, когда я сохранил свое имя хоста и проверил, он работал нормально (сохраните значения проверки условий mbp и joe в соответствии с именем вашего сервера только в зависимости от того, какое имя должно совпадать) для меня, дайте мне знать.

RavinderSingh13 23.06.2018 13:38

@ J.Parmes, да, я дважды проверил свой опубликованный код, и у меня все сработало, пожалуйста, дайте мне знать, как у вас дела?

RavinderSingh13 23.06.2018 13:41

Зачем создавать свою собственную переменную hostname, если bash уже имеет встроенную переменную HOSTNAME?

cdarke 23.06.2018 13:44

@cdarke, я пытался исправить сам скрипт OP, позвольте мне добавить его собственное решение, о котором вы сейчас тоже упомянули.

RavinderSingh13 23.06.2018 13:45

@cdarke, я тоже добавил решение без переменной.

RavinderSingh13 23.06.2018 13:51

Как правило, лучше использовать более современную нотацию hostname=$(hostname) вместо использования обратных кавычек вокруг команды (hostname=`hostname` ).

Jonathan Leffler 23.06.2018 15:44

это должен быть if [[ $var = "string" ]] (одиночный = вместо ==, проверьте help [[)

hek2mgl 23.06.2018 16:50

Оболочка не работает как другие языки программирования. Голые слова - это буквальные строки, а не ссылки на переменные, вызовы подпрограмм или что-то в этом роде. hostname в вашем условии if, следовательно, является буквальной строкой hostname и ничем другим (вы можете заключить его в двойные кавычки, как вы сделали mbp и joe, и ничего здесь не менять; двойные кавычки в основном служат для того, чтобы вы могли помещать пробелы внутри строки, пока она останется одно значение вместо двух последовательных).

В любом случае, поскольку строка «hostname» не совпадает с строкой «mbp» или «joe», ни один пункт if не выполняется.

Если hostname - это переменная (технически «параметр оболочки»), значение которой вы хотите сравнить, вам нужно использовать $hostname для получения этого значения. Если это команда, вывод которой вы хотите сравнить, вам нужно использовать $(hostname), чтобы получить этот вывод:

if [[ $hostname == mbp ]]; then

или же

if [[ $(hostname) == mbp ]]; then

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