私は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
特定の区切り文字に文字列を分割するには、専用の演算子であるs
plitがあります。パラメータ拡張フラグ:
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