Exploração de arquitetura de CPU usando o bash

2

Estou trabalhando em um kit de ferramentas para a empresa em que trabalho, o problema é que uma das ferramentas deste kit precisa ter a capacidade de reconhecer arquiteturas, já tenho 32 e 64 bits funcionando, mas não consigo braço para trabalhar, alguém pode ajudar? isso é o que eu tenho e preciso ..

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

O que eu quero é que quando uma arquitetura de braço (6 ou 7 eu realmente não me importo com esse ponto) seja detectada, que apenas diga arquitetura de braço, mas eu já tentei editar

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

para

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

Se alguém conhece uma solução, qualquer ajuda seria bem-vinda.

Ah, e eu uso o shell / bash porque eles não querem nenhum programa adicional nas máquinas, então eu uso bash e scripts de shell para que eles tenham seus próprios programas:)

------------------ EDITAR ----------- -------

Aqui está o código totalmente para que vocês tenham uma ideia do que estou tentando

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
    
por patrick 27.07.2016 / 15:53

2 respostas

3

Seu padrão funcionaria se você usasse a palavra-chave bash , [[ , em vez do [ ( test ) incorporado e removesse as aspas do padrão glob:

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

Você também pode usar a correspondência de expressão regular usando a palavra-chave [[ e o operador =~ :

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

^arm verifica se a variável $arch contém arm no início (token Regex ^ corresponde ao início de uma linha).

Além disso, para arquiteturas de 32 bits, uname -i deve mostrar i386 ou i686 ou i486 , não x86_32 .

Em uma nota diferente, você deve usar elif construct em vez de usar if três vezes, mas foi projetado para tarefas como essa. Então, seu script completo pode ser reescrito como:

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
    
por heemayl 28.07.2016 / 17:16
0

Se você não puder usar Bash-isms como [[ ... ]] , também poderá usar case blocks para glob-match strings e ramificar de acordo com o resultado da correspondência:

case "'uname -i'" in
  x86_64|amd64)
    echo X64;;
  i?86)
    echo X32;;
  arm*)
    echo ARM;;
  powerpc|ppc64)
    echo PowerPC;;
esac

case blocks também pode ser mais legível que uma série de if ... then ... elif blocks se houver mais de 2 ou 3 branches.

    
por David Foerster 29.07.2016 / 22:40