web-dev-qa-db-ja.com

文字列内の部分文字列を見つける方法(または変数をgrepする方法)

私はBASHを使用していますが、サブストリングを見つける方法がわかりません。それは失敗し続け、私は文字列を持っています(これは配列ですか?)

以下では、LISTはデータベース名の文字列リスト、SOURCEはそれらのデータベースの1つである応答です。以下はまだ機能しません:

echo "******************************************************************"
echo "*                  DB2 Offline Backup Script                     *"
echo "******************************************************************"
echo "What's the name of of the  database you would like to backup?"
echo "It will be named one in this list:"
echo ""
LIST=`db2 list database directory | grep "Database alias" | awk '{print $4}'`
echo $LIST
echo ""
echo "******************************************************************"
echo -n ">>> "
read -e SOURCE

if expr match "$LIST" "$SOURCE"; then
    echo "match"
    exit -1
else
    echo "no match"
fi
exit -1

私もこれを試しましたが、動作しません:

if [ `expr match "$LIST" '$SOURCE'` ]; then
26
edumike
LIST="some string with a substring you want to match"
SOURCE="substring"
if echo "$LIST" | grep -q "$SOURCE"; then
  echo "matched";
else
  echo "no match";
fi
49
dietbuddha

ワイルドカードと比較することもできます。

if [[ "$LIST" == *"$SOURCE"* ]]

29
sreimer

あなたがbashを使用している場合、あなたは言うことができます

if grep -q "$SOURCE" <<< "$LIST" ; then
    ...
fi
7
Sorpigal

これは、外部コマンドをフォークせずにBashで機能します。

function has_substring() {
   [[ "$1" != "${2/$1/}" ]]
}

使用例:

name="hello/world"
if has_substring "$name" "/"
then
   echo "Indeed, $name contains a slash!"
fi
6
Hisham H M
expr match "$LIST" '$SOURCE'

この関数は文字列の先頭から$ SOURCEを検索し、他の0が見つかった場合はパターン$ SOURCEの直後の位置を返すため、機能しません。したがって、別のコードを記述する必要があります。

expr match "$LIST" '.*'"$SOURCE" or expr "$LIST" : '.*'"$SOURCE"

式$ SOURCEは、パーサーが置換を設定できるように二重引用符で囲む必要があります。単一引用符で囲まれた代替ではないため、上記のコードはテキスト文字列$ SOURCEを$ LISTの先頭から検索します。文字列の先頭が必要な場合は、長さ$ SOURCEを減算します(例:$ {#SOURCE})。あなたも書くことができます

expr "$LIST" : ".*\($SOURCE\)"

この関数は、$ LISTから$ SOURCEを抽出して返すだけです。それ以外の場合は空の文字列を取得します。しかし、二重二重引用符に問題があります。追加の変数を使用せずに解決する方法がわかりません。それは軽い解決策です。したがって、Cで記述できます。strstr関数が用意されています。 exprインデックスを使用しないでください。とても魅力的です。ただし、インデックス検索は部分文字列ではなく、最初の文字のみです。

1
Anatoly

単一の文字のみを検索する場合は、「インデックス」を使用できます。例:

LIST="server1 server2 server3 server4 server5"
SOURCE="3"
if expr index "$LIST" "$SOURCE"; then
    echo "match"
    exit -1
else
    echo "no match"
fi

出力は次のとおりです。

23
match
1
Angelo Babudro

exprが使用されますではなく [その内部ではなく、変数は二重引用符内でのみ展開されるため、これを試してください:

if expr match "$LIST" "$SOURCE"; then

しかし、私はSOURCEが何を表すのか、本当に明確ではありません。

コードは標準入力からパターンを読み取り、データベースエイリアスと一致する場合は終了し、そうでない場合は「ok」とエコーします。それはあなたが望むものですか?

0
Mikel

さて、このようなものはどうですか:

PS3="Select database or <Q> to quit: "
select DB in db1 db2 db3; do
   [ "${REPLY^*}" = 'Q' ] && break
   echo "Should backup $DB..."
done
0