文字列値が配列要素と一致するかどうかをテストする

文字列値が配列要素と一致するかどうかをテストする

私はbashスクリプトを使用しており、カンマで区切られた値文字列がありますstring="string1,string2,string"。各文字列にはコンマやスペースは含まれていません。文字列要素が配列にあるかどうかをテストしたいと思います。

文字列要素を任意の配列の要素と一致させるには?

string="element1,element2,element3"
array=($(echo $string | tr ',' ' '))
for i in "${array[@]}"; do
    if [ "$i" == "element2" ]; then
        echo "element found"
    fi
done

ベストアンサー1

おそらく次のようにすることができます:

string=element1,element2,element3
element=element2
case ",$string," in
  (*,"$element",*) echo element is in string;;
  (*) echo it is not;;
esac

(標準sh構文).

配列操作や文字列分割の場合、bashはシェルの中で最悪の選択肢の1つです。

zsh特定の区切り文字に文字列を分割するには、専用の演算子であるsplitがあります。パラメータ拡張フラグ:

array=( "${(@s[,])string}" )

(Bourneシェルの@ように空の要素を保存するために引用符を使用)"$@"

配列に与えられた要素があることを確認してください。

if (( $array[(Ie)$element] )); then
  print element is in the array
else
  print it is not
fi

分割するには、ksh / shのように、bash分割+glob演算子(引用符なしで使用するのは少し厄介です)を使用できます。$(...)

IFS=, # split on , instead of the default of SPC/TAB/NL
set -o noglob # disable the glob part which you don't want
array=( $string'' ) # split+glob; '' added to preserve an empty trailing element
                    # though that means an empty $string is split into one empty
                    # element rather than no element at all

配列を見つけるためにbashには専用の演算子はありませんが、ヘルパー関数を定義できます。

is_in() {
  local _i _needle="$1"
  local -n _haystack="$2"
  for _i in "${_haystack[@]}"; do
    [ "$_i" = "$_needle" ] && return
  done
  false
}
if is_in "$element" array; then
  echo element is in the array
else
  it is not
fi

おすすめ記事