Dentro de [[ .. ]] , o operador = é, na verdade, uma correspondência de padrões, portanto, [[ $1 != *[!0-9]* ]] testa se o valor de $1 não corresponde ao padrão *[!0-9]* .
Os padrões usados aqui são os mesmos para expansão de nome de arquivo, por isso * corresponde a qualquer caractere e [abc] de qualquer caractere entre colchetes e [!abc] ou [^abc] de qualquer caractere não entre parênteses (excluindo a inicial ! ou ^ ). Na verdade, isso testa se $1 contiver algum caractere que não seja um dígito de 0 a 9 .
declare -i var marcaria a variável var como uma variável inteira: atribuições a ela seriam interpretadas como em um contexto aritmético, portanto declare -i a; a=3+5; echo $a; produziria 8 . Mas você não pode usar isso em um parâmetro posicional, como $1 . Em vez disso, declare -i $1 usaria a string contida em $1 e usaria essa como um nome de variável. (Observe que não há $ em declare -i a acima.)
Você não pode usar declare -i para testar se algo é um número, já que as sequências no contexto aritmético são tomadas como variáveis nomes . Isso não é um erro: declare -i a; b=1+2; a=b; echo $a; . Em vez disso, imprime 3 , que pode ou não ser o que você deseja.