Bash: проверьте, если имя хоста v-q * как использовать подстановочные знаки? - PullRequest
18 голосов
/ 10 мая 2011

У меня есть следующий код, и мне нужно, чтобы он выводил 1, если имя хоста совпадает с v-qai01 или любыми другими серверами v-q *:

if [ `hostname -s` -eq `v-q*` ]; then
        echo "1"
fi

У меня несколько ошибок:

./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

Спасибо

Ответы [ 4 ]

38 голосов
/ 10 мая 2011

Используйте двойные квадратные скобки, и оператор = примет подстановочные знаки:

#!/bin/bash

if [[ $(hostname -s) = v-q* ]]; then
    ...
fi

Также имеется оператор =~ для совпадений регулярных выражений, когда вам нужно более сложное сопоставление строк. Это позволит проверить, что имя хоста также заканчивается одной или несколькими цифрами:

#!/bin/bash

if [[ $(hostname -s) =~ ^v-q.*[0-9]+$ ]]; then
    ...
fi
6 голосов
/ 10 мая 2011

Вы можете использовать оператор case:

case $(hostname -s) in
  v-q*) echo yes ;;
  *) echo no ;;
esac
4 голосов
/ 07 июня 2012

Фактическая проблема, с которой столкнулся оригинальный постер, заключалась в том, что они использовали обратные ноты вокруг строки:

if [ `hostname -s` -eq `v-q*` ]; then

, а не строковые кавычки. Обратные метки говорят оболочке выполнить строку внутри них как команду. В этом случае оболочка пыталась выполнить:

v-q* 

, что не удалось.

1 голос
/ 10 мая 2011

Это удалит v-q из начала строки. Если условие истинно, ваше имя хоста соответствует v-q*

hostname=`hostname -s`
if ! [ "${hostname#v-q}" = "${hostname}" ]; then
  echo "1"
fi
...