入力パラメータのパターン一致

入力パラメータのパターン一致

私たちはスクリプトの1つを改善しようとしています。

ユーザーはいくつかのパラメータを渡し、いくつかのパラメータは5.0.3Jboss5.0.3GAJboss5.0.3GAには「5.0.3」があるので、インストールバイナリ「Jboss5.0.3GA.tar」を探してみましょう。

現在のスクリプトはkshスクリプトです。ifスクリプトで条件を使用しようとしています。

ユースケースと結果の例:

./test.sh Jboss5.0.3GA
Match found... we'll try to locate the installation binary
./test.sh Jboss5.0.3
Match found... we'll try to locate the installation binary
./test.sh 5.0.3
Match found... we'll try to locate the installation binary
./test.sh Jboss5.1.3
No Match found ... we'll be exiting the script.

答え1

POSIXシェルのパターンマッチングはcaseこの設定で行われます。kshまた、演算子([[ x = pattern ]]and にもコピーされます)と最新バージョンです。bashzsh[[ x =~ regexp ]]

だから:

case $1 in
  (*5.0.3*)
    install=$1.tar
    echo Found;;
  (*)
    echo >&2 Not found
    exit 1;;
esac

答え2

私は正規表現の専門家ではありませんが、少なくともあなたが説明するものには有効です。

#!/bin/sh

argument="$1"

#if [[ $argument =~ [a-zA-Z]*5\.0\.3[a-zA-Z]+ ]]; then# only works on bash
if echo $argument | egrep -q '[a-zA-Z]*5\.0\.3[a-zA-Z]+'; then
  #echo "Found: ${BASH_REMATCH[0]}" # for bash
  echo "Match Found"

  # you can check for $argument at some other location, here.

else
  echo "No match"
fi

別の名前で保存してtest実行すると、次の結果が表示されます。

bash test 333xxxx5.0.3xxxxx777
Match Found

bash test 333xxxx5.0.2xxxxx777
No match

bash test 5.0.3xxxxx777
Match Found

bash test 5.0.2xxxxx777
No match

文字列全体に一致するように^開始と終了に追加したり、何も追加しないことがあります。$このように^[a-zA-Z]*5\.0\.3[a-zA-Z]+$

関連情報