【问题标题】:Bash: if my variable matches one of arrays [duplicate]Bash:如果我的变量与数组之一匹配[重复]
【发布时间】:2015-04-16 14:44:48
【问题描述】:

我创建了一个短信自动回复脚本,目前它允许从我的机器回复所有电话号码,现在我只想过滤一个特定的电话号码,所以当其他电话号码不在列表中时,我的机器会忽略它.

#!/bin/bash
PhoneNumberFilter="yes"
PhoneNumber[0]="08123"
PhoneNumber[1]="08321"
PhoneNumber[2]="12345"

MyPhoneNumber="08321"
echo "My phone number is: $MyPhoneNumber"
echo "all numbers: ${PhoneNumber[@]}"
if [[ "$PhoneNumberFilter" == "yes" ]] && [[ *"$MyPhoneNumber"* == "${PhoneNumber[*]}" ]]; then
    echo "it works"
    echo "My phone number is in the list of arrays"
    echo "Send SMS to my phone number only"
else
    echo "it doesn't work, my phone number is not in the list"
    echo "ignore it"
fi

如何显示it works 部分?当我执行该脚本时,它总是显示it doesn't work 部分。

【问题讨论】:

  • 执行此操作的高效方法是将数字存储在键字段中,而不是值字段中;那么这是一个 O(1) 查找。
  • 还是没看懂,抱歉我还在学习,应该怎么实现呢?
  • 我用命令case 修复了它,谢谢:D
  • 删除了我之前的评论——我错了。正确的东西实际上是[[ " ${PhoneNumber[*]} " = *" $MyPhoneNumber "* ]]——带有空格。但是,如果数组值可以包含空格,这仍然是错误的(容易出现误报),因此关联数组方法可以更好地扩展并且更可靠。

标签: bash


【解决方案1】:

在数组中存储键中的数字,而不是值。如下所示,这需要 bash 4.0 或更高版本(对于关联数组)——尽管对于纯数字值,它也可以在没有它们的情况下实现(需要注意的是,即使值以 0 开头,也需要确保 base-10 解析)。

declare -A phoneNumbers=( [08123]=1 [08321]=1 [12345]=1 )
myPhoneNumber=08321

if [[ ${phoneNumbers[$myPhoneNumber]} ]]; then
  echo "Found"
fi

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 2016-06-02
    • 2011-12-09
    • 1970-01-01
    • 2012-09-24
    相关资源
    最近更新 更多