web-dev-qa-db-ja.com

Bash:ホスト名がv-q *であるかどうかを確認します。ワイルドカードの使用方法は?

次のコードがあり、ホスト名がv-qai01または他のv-q *サーバーと一致する場合は、1をエコーする必要があります。

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

ありがとう

20
BoDiE2003

二重角かっこを使用すると、=演算子はワイルドカードを受け入れます。

#!/bin/bash

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

より高度な文字列照合が必要な場合は、正規表現照合用の=~演算子もあります。これにより、ホスト名も1桁以上で終わることが確認されます。

#!/bin/bash

if [[ $(hostname -s) =~ ^v-q.*[0-9]+$ ]]; then
    ...
fi
38
John Kugelman

caseステートメントを使用できます。

case $(hostname -s) in
  v-q*) echo yes ;;
  *) echo no ;;
esac
6
glenn jackman

元のポスターが持っていた実際の問題は、文字列の周りにバックティックを使用していたことでした。

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

文字列の引用符ではなく。バックティックは、シェル内の文字列をコマンドとして実行するようにシェルに指示します。この場合、シェルは以下を実行しようとしました。

v-q* 

失敗しました。

4
Ms CodeGuru

これにより、文字列の先頭からv-qが削除されます。条件が真の場合、ホスト名はv-q*と一致します

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