使用 bash 扫描 CPU 架构

使用 bash 扫描 CPU 架构

我正在为公司开发一个工具包,问题是,这个“工具包”中的一个工具需要有识别架构的能力,我已经让 32 位和 64 位工作了,但我无法让 arm 工作,有人能帮忙吗?这就是我得到和需要的。

if [ "$arch" == 'armv' ];
then
echo "ARM Architecture

我希望它能检测到 arm 架构(6 或 7,我不太关心这一点)时,它只会显示 arm 架构,但我已经尝试编辑

if [ "$arch" == 'armv' ];

if [ "$arch" == 'armv*' ];

如果有人知道解决方案,我们将欢迎任何帮助。

哦,我使用 shell/bash 是因为他们不想在机器上安装任何附加程序,所以我使用 bash 和 shell 脚本,这样他们就有了自己的程序 :)

------------------ 编辑 ------------------

这是完整的代码,这样你们就可以知道我在尝试什么

arch=$(uname -i)

if [ "$arch" == 'x86_64' ];
then 
echo "X64 Architecture" 
fi

if [ "$arch" == 'x86_32' ];
then
echo "X32 Architecture"
fi

if [ "$arch" == 'armv*' ];
then
echo "Arm architecture"
fi

答案1

如果您使用关键字bash[[而不是内置的[( test),并从 glob 模式中删除引号,那么您的模式就会起作用:

[[ $arch == arm* ]] && echo 'This is ARM Architecture'

您还可以使用[[关键字和=~运算符进行正则表达式匹配:

[[ $arch =~ ^arm ]] && echo 'This is ARM Architecture'

^arm检查变量是否$arch包含arm在开头(正则表达式标记^与行的开头匹配)。


此外,对于 32 位架构,uname -i应该显示i386i686i486,而不是x86_32

另外,您应该使用elif构造而不是使用if三次,它是为此类任务而设计的。因此,您的完整脚本可以重写为:

arch=$(uname -i)
if [[ $arch == x86_64* ]]; then
    echo "X64 Architecture"
elif [[ $arch == i*86 ]]; then
    echo "X32 Architecture"
elif  [[ $arch == arm* ]]; then
    echo "ARM Architecture"
fi

答案2

在 Jetson Nano 上你会看到:aarch64

AArch64 是 Armv8-A 架构中引入的 64 位状态 https://en.wikipedia.org/wiki/ARM_architecture#ARMv8-A

arch=$(uname -i)
if [[ $arch == x86_64* ]]; then
    echo "X64 Architecture"
elif [[ $arch == i*86 ]]; then
    echo "X32 Architecture"
elif  [[ $arch == arm* ]] || [[ $arch = aarch64 ]]; then
    echo "ARM Architecture"
fi

答案3

如果您不能使用类似的 Bash 主义,[[ ... ]]那么您也可以使用case块来全局匹配字符串并根据匹配结果进行分支:

arch=`uname -i`
case "$arch" in
  x86_64|amd64)
    echo X64;;
  i?86)
    echo X32;;
  arm*)
    echo ARM;;
  powerpc|ppc64)
    echo PowerPC;;
  *)
    printf 'Unsupported architecture: "%s"\n' "$arch" >&2; exit 2;;
esac

caseif ... then ... elif如果有超过 2 个或 3 个分支,块也可能比一系列块更具可读性。

答案4

虽然上述 Mehrad Mahmoudian 的回答确实有效,但更简单的 -m 标志执行完全相同的功能并在其他操作系统中得到支持。

如果您正在寻找兼容性,我强烈建议您使用类似这样的方法:

ARCH=$(uname -m)
if [[ "$ARCH" == x86_64* ]]; then
  echo "X64 Architecture"
elif [[ "$ARCH" == i*86 ]]; then
  echo "X32 Architecture"
elif  [[ "$ARCH" == arm* ]]; then
  echo "ARM Architecture"
fi

原因是,

uname -m

可以在 Ubuntu 和 OSX 上运行,同时

uname --machine

仅在 Ubuntu 中有效,并在 OSX 中返回非法选项。

相关内容