Подтвердить что ты не робот

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

Спасибо

4b9b3361

Ответ 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