私は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
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
ワイルドカードと比較することもできます。
if [[ "$LIST" == *"$SOURCE"* ]]
あなたがbashを使用している場合、あなたは言うことができます
if grep -q "$SOURCE" <<< "$LIST" ; then
...
fi
これは、外部コマンドをフォークせずにBashで機能します。
function has_substring() {
[[ "$1" != "${2/$1/}" ]]
}
使用例:
name="hello/world"
if has_substring "$name" "/"
then
echo "Indeed, $name contains a slash!"
fi
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インデックスを使用しないでください。とても魅力的です。ただし、インデックス検索は部分文字列ではなく、最初の文字のみです。
単一の文字のみを検索する場合は、「インデックス」を使用できます。例:
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
exprが使用されますではなく [その内部ではなく、変数は二重引用符内でのみ展開されるため、これを試してください:
if expr match "$LIST" "$SOURCE"; then
しかし、私はSOURCEが何を表すのか、本当に明確ではありません。
コードは標準入力からパターンを読み取り、データベースエイリアスと一致する場合は終了し、そうでない場合は「ok」とエコーします。それはあなたが望むものですか?
さて、このようなものはどうですか:
PS3="Select database or <Q> to quit: "
select DB in db1 db2 db3; do
[ "${REPLY^*}" = 'Q' ] && break
echo "Should backup $DB..."
done