
bash配列に特定の値があるかどうかを確認しようとしています。もしそうなら、それについて何かをしてください。それ以外の場合は別のことをしてください。
なぜこれがいつも私に失敗するのか分かりません。
デフォルトでは、2つの別々の値から始まり、区切り文字で連結し、配列を検索してから、文字列全体(区切り記号と両方)が配列要素にある場合は、それを実行して別の操作を実行します。
#!/bin/bash
FNAME="JACK"
LNAME="BLACK"
SEARCHNAME=()
SEARCHNAME+="JACK-BLACK"
SEARCHNAME+="JOHN-JAMES"
SEARCHNAME+="CHRIS-TOPHER"
SEARCHNAME+="JEN-NAY"
NAME="${FNAME}-${LNAME}"
if [[ $NAME == *"${SEARCHNAME[@]}"* ]]; then
echo "PASSED"
else
echo "FAILED"
fi
echo "SEARCH IN: ${SEARCHNAME[@]}"
echo "FOR NAME: ${NAME}"
結果:
FAILED
SEARCH IN: JACK-BLACKJOHN-JAMESCHRIS-TOPHERJEN-NAY
FOR NAME: JACK-BLACK
私も試してみましたが、if [[ "${NAME}" == *"${SEARCHNAME[@]}"* ]]
違いはありません...ここには非常に明確なものがありませんでした。そして、それが配列を宣言する方法と関係があると思いますか?各配列要素間のスペース不足(配列出力で見ることができます)がワイルドカードの影響を受けないことを願っています。
答え1
配列割り当てを変更し、テストを正規表現に変更します。
#!/bin/bash
FNAME="JACK"
LNAME="BLACK"
SEARCHNAME=()
SEARCHNAME+=("JACK-BLACK")
SEARCHNAME+=("JOHN-JAMES")
SEARCHNAME+=("CHRIS-TOPHER")
SEARCHNAME+=("JEN-NAY")
NAME="${FNAME}-${LNAME}"
if [[ "${SEARCHNAME[@]}" =~ $NAME ]]; then
echo "PASSED"
else
echo "FAILED"
fi
echo "SEARCH IN: ${SEARCHNAME[@]}"
echo "FOR NAME: ${NAME}"
答え2
以下は参考にするいくつかの点です。
- ここでは平等を追求しませんので、
==
代わりに使用してください。=~
- これは
regex
ちょっとwildcard
... [[のオペランドの順序を逆に変更する必要があります。つまり、
if [[ ${SEARCHNAME[@]} =~ .*$NAME.* ]]