Сейчас изучаю оболочку и написал небольшой скрипт для использования функций:
#!/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. Любые идеи?
Спасибо! Это сработало!
Вам не нужно вызывать внешнюю программу hostname, в bash уже есть переменная, используйте $HOSTNAME.





Если вы не хотите создавать свою собственную переменную для имени хоста, используйте следующее (встроенный Переменная 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, поэтому, возможно, ни одно из условий не выполняется для вашего текущего хоста (потому что команда hostname примет имя текущего сервера), потому что, когда я сохранил свое имя хоста и проверил, он работал нормально (сохраните значения проверки условий mbp и joe в соответствии с именем вашего сервера только в зависимости от того, какое имя должно совпадать) для меня, дайте мне знать.
@ J.Parmes, да, я дважды проверил свой опубликованный код, и у меня все сработало, пожалуйста, дайте мне знать, как у вас дела?
Зачем создавать свою собственную переменную hostname, если bash уже имеет встроенную переменную HOSTNAME?
@cdarke, я пытался исправить сам скрипт OP, позвольте мне добавить его собственное решение, о котором вы сейчас тоже упомянули.
@cdarke, я тоже добавил решение без переменной.
Как правило, лучше использовать более современную нотацию hostname=$(hostname) вместо использования обратных кавычек вокруг команды (hostname=`hostname` ).
это должен быть if [[ $var = "string" ]] (одиночный = вместо ==, проверьте help [[)
Оболочка не работает как другие языки программирования. Голые слова - это буквальные строки, а не ссылки на переменные, вызовы подпрограмм или что-то в этом роде. hostname в вашем условии if, следовательно, является буквальной строкой hostname и ничем другим (вы можете заключить его в двойные кавычки, как вы сделали mbp и joe, и ничего здесь не менять; двойные кавычки в основном служат для того, чтобы вы могли помещать пробелы внутри строки, пока она останется одно значение вместо двух последовательных).
В любом случае, поскольку строка «hostname» не совпадает с строкой «mbp» или «joe», ни один пункт if не выполняется.
Если hostname - это переменная (технически «параметр оболочки»), значение которой вы хотите сравнить, вам нужно использовать $hostname для получения этого значения. Если это команда, вывод которой вы хотите сравнить, вам нужно использовать $(hostname), чтобы получить этот вывод:
if [[ $hostname == mbp ]]; then
или же
if [[ $(hostname) == mbp ]]; then
Это не сработает, если ваше имя хоста - «joe».
hostmameнеобходимо выполнить. Таким образом, он не будет выполняться внутри условияif. Попробуйте$(hostname)и прочтите некоторую документацию по оболочке, касающуюся скриптов.