Bash: проверить, является ли hostname v-q * как использовать подстановочные знаки?
У меня есть следующий код, и мне нужно его эхо 1, если имя хоста совпадает с v-qai01 или любыми другими серверами v-q *:
if [ `hostname -s` -eq `v-q*` ]; then
echo "1"
fi
Im имеет несколько ошибок:
./run.sh: line 3: v-q*: command not found
./run.sh: line 3: [: v-qai01: unary operator expected
Любые предложения, пожалуйста?
Что делать, если у меня следующий случай?
hostname=`hostname -s`
portalesWildcard=v-*ws*
qaiservers={'v-qai01' 'v-qai02'}
portales={'t1wsyellar01' }
if [[ ${hostname} = ${qaiservers} ]]; then
echo "yes"
fi
Спасибо
Ответы
Ответ 1
Используйте двойные квадратные скобки, а оператор =
примет подстановочные знаки:
#!/bin/bash
if [[ $(hostname -s) = v-q* ]]; then
...
fi
Он также имеет оператор =~
для совпадений регулярных выражений, когда вам требуется более сложное сопоставление строк. Это проверит, что имя хоста также заканчивается одной или несколькими цифрами:
#!/bin/bash
if [[ $(hostname -s) =~ ^v-q.*[0-9]+$ ]]; then
...
fi
Ответ 2
вы можете использовать оператор case
:
case $(hostname -s) in
v-q*) echo yes ;;
*) echo no ;;
esac
Ответ 3
Фактическая проблема, с которой столкнулся оригинальный плакат, заключалась в том, что они использовали обратные ссылки вокруг строки:
if [ `hostname -s` -eq `v-q*` ]; then
а не строковые кавычки. Backticks сообщают оболочке о выполнении строки внутри них в качестве команды. В этом случае оболочка попыталась выполнить:
v-q*
который не удался.
Ответ 4
Это приведет к удалению v-q
с начала строки. Если условие истинно, ваше имя хоста соответствует v-q*
hostname=`hostname -s`
if ! [ "${hostname#v-q}" = "${hostname}" ]; then
echo "1"
fi