【问题标题】:BASH Check if exists within variableBASH 检查变量中是否存在
【发布时间】:2011-12-19 19:26:46
【问题描述】:

我正在编写一个用于映射网络驱动器的脚本。但是,我们只想在机器具有特定 IP 地址的情况下尝试映射驱动器。下面列出的是我们正在尝试使用的代码 sn-p。

#!/bin/sh

IP="dig $HOSTNAME +short"

if [ $IP == *10.130.10.* ]; then
    mount drive commands here
fi

if [ $IP == *10.130.11.* ]; then
    mount drive commands here
fi

我无法让 IP 检查工作。有没有更好的方法来检查变量是否包含字符串,在这种情况下是 IP 地址的一部分?

this 发布中列出的信息没有帮助,因为它不起作用。

【问题讨论】:

  • 我不认为[ 可以测试复杂的子字符串。它只能做字符串相等,但只有一个=
  • @KerrekSB:确实不能。在 bash 中,您可以使用 [[ $VAR == *pattern* ]](注意双括号)。或者您可以在任何与 POSIX 兼容的 shell(包括 bash)中使用 case
  • @derobert:哦,太好了,我不知道[[——谢谢!

标签: macos bash shell scripting ip-address


【解决方案1】:

你在问题​​上有一个“bash”标签,但 shebang 说 /bin/sh。您真正想使用哪个?

其实,第一要务。您设置 IP 的方式不起作用,因为它从不运行 dig 命令;你需要反引号或$( ) 来做到这一点:

IP="$(dig $HOSTNAME +short)"

现在,进行测试;有很多方法可以做到这一点。这应该适用于所有外壳:

case "$IP" in
    *10.130.10.*)
        mount drive commands here
        ;;
    *10.130.11.*)
        mount drive commands here
        ;;
esac

请注意,如果两个子网的挂载命令相同,则可以使用*10.130.10.*|*10.130.11.*) 作为匹配模式。

如果您实际使用的是 bash,则可以使用它的 [[ ]] 条件表达式来进行匹配,更像是您的匹配方式:

if [[ "$IP" == *10.130.10.* ]]; then
    mount drive commands here
elif [[ "$IP" == *10.130.11.* ]]; then
    mount drive commands here
fi

如上,如果挂载命令相同,可以用if [[ "$IP" == *10.130.10.* || "$IP" == *10.130.10.* ]]; then做一个条件。此外,在这种特殊情况下,$IP 周围的双引号实际上并不是必需的,但我总是养成双引号变量的习惯,除非有理由不这样做。

【讨论】:

  • @ Gordon - 这非常有效。感谢您的出色解释,这确实有助于我了解一些事情不工作的原因以及下次如何做得更好。我真的很感激!
  • @ Gordon - 出于好奇,我应该如何修复与“bash”标签和 shebang 相关的脚本的开头?
  • 脚本的第一行(以#! aka sharp-bang 或shebang 开头)告诉操作系统使用什么解释器来读取它——bash、perl、python 等。对于 bash,使用#!/bin/bash#!/bin/sh 在您的计算机上安装的任何“普通”Bourne shell 下运行它,它可能支持也可能不支持任何 bash 的扩展。所以如果你想使用像[[ ]]这样的bash扩展,用#!/bin/bash启动脚本是最安全的。
  • @ Gordon - 很好的信息。非常感谢您的帮助,我学到了很多东西,真的很感激!!!
【解决方案2】:
[[ "${IP/10.130.10./}" = "$IP" ]] || mount

【讨论】:

  • 这似乎与我为您的表达式的第一部分尝试的任何 IP 匹配。
  • 我正在测试以下 --- if [[ "${IP/10.130.10./}" = "$IP" ]];然后呼应幸福!菲
  • @John:不,请注意反转逻辑:echo Unhappiness@Michael:Bash 变量体操的使用很好:-)
  • @Kerrek - 这是否意味着我的测试搞砸了?
  • @John,我用||,意思是if false
猜你喜欢
  • 2011-12-25
  • 2014-09-08
  • 2020-10-21
  • 2017-02-13
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
相关资源
最近更新 更多