有没有办法在没有循环的bash中搜索数组中的相同性?

时间:2017-08-11 07:46:35

标签: bash loops if-statement

所以我有一个带字符串的数组,另一个字符串变量本身,当变量是数组的元素之一时,我想做一个过程。可以写一个IF线,而不用循环检查所有元素吗?

1 个答案:

答案 0 :(得分:3)

Bash现在支持关联数组,即键是字符串的数组:

declare -A my_associative_array

所以,您可以将经典数组转换为关联数组,并通过简单的方式访问您要查找的条目:

my_string="foo bar"
my_associative_array["$my_string"]="baz cux"
echo "${my_associative_array[$my_string]}"
echo "${my_associative_array[foo bar]}"

并测试密钥的存在:

if [ "${my_associative_array[$my_string]:+1}" ]; then
  echo yes;
else
  echo no;
fi

来自bash手册:

   ${parameter:+word}
          Use Alternate Value.  If parameter is null or unset, nothing
          is substituted, otherwise the expansion of word is substituted.

因此,如果键$my_string为空或未设置,则${my_associative_array[$my_string]:+1}会扩展为空,否则扩展为1。剩下的只是if bash语句与test[])相结合的经典用法:

if [ 1 ]; then echo true; else echo false; fi

打印true时:

if [ ]; then echo true; else echo false; fi

打印false。如果您希望将null条目视为任何其他现有条目,则只需省略冒号:

if [ "${my_associative_array[$my_string]+1}" ]; then
  echo yes;
else
  echo no;
fi

来自bash手册:

          Omitting the colon results in a test only for a parameter
          that is unset.