【问题标题】:Error when checking for substring in Bash在 Bash 中检查子字符串时出错
【发布时间】:2020-06-17 14:19:12
【问题描述】:

我对 shell 脚本很陌生,在尝试检查字符串中的子字符串时遇到了问题。 我想构建代码来检查您是否正在运行基于 64 位的系统。这由第一行中x86_64uname -m && cat /etc/*release 命令的输出指示。

这是我的代码:

INFO=$(uname -m && cat /etc/*release)
if [ "$INFO" == *"x86_64"* ]
then
    echo "You are running a 64bit-based system!"
else
    echo "Your system architecture is wrong!"
    exit
fi

虽然我运行基于 64 位的系统并且 x86_64 显示在我的命令输出中,但 if 语句仍然返回 false,所以我得到了输出 Your system architecture is wrong!。应该是相反的。 有人可以通过确定我做错了什么来帮助我吗?我也接受改进我的方法的一般建议,但首先,我想知道错误在哪里。

非常感谢您的帮助!

【问题讨论】:

  • 请注意 Arch Linux 的 /etc/arch_release 不包含字符串 x86x86_64。 (它有一些像PRETTY_NAME="Arch Linux"BUILD_ID=rolling 这样的行)。也许file /bin/ls 作为一种检查用户空间位数的方式更便携。 (与 uname -a 的内核位数相反,它可能是运行 32 位用户空间的 64 位内核。)
  • 您是使用/bin/sh 还是使用/bin/bash 或其他方式运行此脚本?
  • @glennjackman 我正在使用 /bin/bash

标签: linux bash shell 64-bit x86-64


【解决方案1】:
[

[ 命令等同于test 命令。 test 不支持任何类型的高级匹配。 test 可以将字符串与 = 进行比较 - 在​​ test 中将字符串与 == 进行比较是一个 bash 扩展。

通过做:

[ "$INFO" == *"x86_64"* ]

您实际上正在运行像 [ "$INFO" == <the list of files that match"x86_64"pattern> ] 这样的命令 - *"x86_64"* 经历了文件名扩展。如果您有一个名为 something_x86_64_something 的文件,它将被放置在那里,与 cat *"x86_64"* 的工作方式相同。

bash 扩展[[ command 支持模式匹配。做:

if [[ "$INFO" == *"x86_64"* ]]

对于始终适用于任何类型的 posix shell 的可移植脚本,请使用 case

case "$INFO" in
*x86_64*) echo yes; ;;
*) echo no; ;;
esac

【讨论】:

    【解决方案2】:

    如果 bash 版本 >= 3,您可以使用正则表达式:

    [[ "$INFO" =~ x86_64 ]]
    

    【讨论】:

    • 可能,但没必要,因为通配符 `[[ $INFO == x86_64 ]] 也可以。
    【解决方案3】:

    不确定为什么会这样,但是您的代码在方括号加倍后开始工作:

    INFO=$(uname -m && cat /etc/*release)
    if [[ "$INFO" = *x86_64* ]]
    then
        echo "You are running a 64bit-based system!"
    else
        echo "Your system architecture is wrong!"
        exit
    fi
    

    也许可以在Is double square brackets [[ ]] preferable over single square brackets [ ] in Bash? 等下找到一些解释。

    【讨论】:

    • 当然。双括号确保在操作的左侧完成通配,即$INFO,而不是目录中的文件。顺便说一句,如果你愿意,你可以省略双引号,因为在这种情况下没有进行分词。
    【解决方案4】:

    检查 64 位的一种方法是简单地 grep /bin/arch 的输出

    if  /bin/arch | grep -q x86_64
    then
      echo "it is 64 bit"
    else
      echo "it is not"
    fi
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 2011-02-18
      • 1970-01-01
      • 2016-02-24
      • 1970-01-01
      相关资源
      最近更新 更多