我正在为公司开发一个工具包,问题是,这个“工具包”中的一个工具需要有识别架构的能力,我已经让 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
应该显示i386
或i686
或i486
,而不是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
case
if ... 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 中返回非法选项。