簡単なスクリプトのヘルプ
#!/bin/bash
array1=(
prova1
prova2
slack64
)
a="slack64"
b="ab"
if [ $a = $b ]
then
echo "$a = $b : a is equal to b"
else
echo "$a = $b: a is not equal to b"
fi
このスクリプトは単に機能しません。slack64がリストに存在するかどうかを確認するスクリプトが必要です(配列を使用します)。配列を単一の変数と比較する方法がわかりません。
別の種類の配列を使用します。整数インデックス配列ではなく、連想配列を使用して、キー(インデックス)を確認します。 bash-4.0
以降が必要です。
declare -A array1=(
[prova1]=1 [prova2]=1 [slack64]=1
)
a=slack64
[[ -n "${array1[$a]}" ]] && printf '%s is in array\n' "$a"
上記では、値を実際に気にする必要はありません。これを行うには、空である必要はありません。キーと値を交換することにより、インデックス付き配列を新しい連想配列に「反転」できます。
declare -a array1=(
prova1 prova2 slack64
)
declare -A map # required: declare explicit associative array
for key in "${!array1[@]}"; do map[${array1[$key]}]="$key"; done # see below
a=slack64
[[ -n "${map[$a]}" ]] && printf '%s is in array\n' "$a"
連想配列の実装は配列横断ループよりもパフォーマンスが高いため、頻繁に検索される大きな配列がある場合、これは報われることがあります。ただし、重複を処理できないため(上記のように1だけではなく、カウンターとして値を使用できます)、空のインデックスを処理できないため、すべてのユースケースに適しているわけではありません。
上記の複雑な行を分解して、「反転」を説明します。
for key in "${!a[@]}" # expand the array indexes to a list of words
do
map[${a[$key]}]="$key" # exchange the value ${a[$key]} with the index $key
done
簡単な方法はループで繰り返すことです:
var=ab
for item in "${array[@]}"; do
[[ $var == "$item" ]] && echo "$var present in the array"
done
そのためにgrepを使用することもできます。
array1 =(prova1 prova2 slack64) a = slack64 if(printf '%s\n' "$ {array1 [@]}" | grep -xq $ a) ;次に echo "it's in" fi
zsh
の場合:
array1=(
prova1
prova2
slack64
)
a=slack64
if ((array1[(Ie)$a])); then
printf '%s\n' "$a in array1"
fi
この関数は連想配列で機能します。
この関数を使用して、次のいずれかを実行できます。
-配列に特定のキーがあるかどうかを確認します-----------------> inArray "myKey" $ {!myArray [@]} "
-配列に特定の値が含まれているかどうかを確認します---------> inArray "myValue" "$ {myArray [@]}"
function inArray # ( keyOrValue, arrayKeysOrValues )
{
local e
for e in "${@:2}"; do
[[ "$e" == "$1" ]] && return 0;
done
return 1
}
declare -A arr
arr[doo]=55
inArray "doo" "${!arr[@]}"
echo $? # 0
inArray "bla" "${!arr[@]}"
echo $? # 1
inArray "55" "${arr[@]}"
echo $? # 0