Como faço para extrair o primeiro dígito de um número (variável em um script bash)? [duplicado]

5

Digamos que a variável numbers=$@ em que $@ seja da entrada do usuário. O usuário digitou ./script.sh 901.32.02 e eu quero obter o primeiro dígito 9 e armazenar em outra variável. Como posso fazer isso? Foi-me dito para fazer

  for n in 'seq 1 $count'
    do var=${numbers[0]}
  done

mas isso imprime toda a entrada se eu echo $var em vez de apenas 9 .

    
por Rashad 02.04.2018 / 06:10

5 respostas

8

No Bash, você pode extrair o primeiro caractere usando expansão de parâmetro :

${parameter:offset:length}

Exemplo:

$ var=901.32.02
$ first_char="${var:0:1}"
$ echo "${first_char}"
9
    
por 02.04.2018 / 10:10
4
numbers='901.32.02'
firstdigit="${numbers:0:1}"

printf 'The first digit is "%s"\n' "$firstdigit"

O resultado do acima é

The first digit is "9"

A expansão do parâmetro ${numbers:0:1} em bash fornece a subseqüência de comprimento 1 desde o início da string (offset zero). Esta é uma substituição do parâmetro bash -specific (também em algumas outras shells, mas não no padrão POSIX).

Em um shell POSIX, você também pode fazer

firstdigit=$( printf "%s\n" "$numbers" | cut -c 1 )

Isso usará cut para retornar apenas o primeiro caractere.

Ou, usando expansões de parâmetros padrão,

firstdigit="${numbers%${numbers#?}}"

Isso primeiro usa ${numbers#?} para criar uma string com o primeiro dígito removido , depois remove essa string do final de $numbers usando ${numbers%suffix} (onde suffix é o resultado da primeira expansão).

O texto acima assume que o primeiro caractere de $numbers é, na verdade, um dígito. Se não estiver, você deve primeiro remover os não dígitos do início do valor:

numbers=$( printf '%s\n' "$numbers" | sed 's/^[^0-9]*//' )

ou

numbers="${numbers#${numbers%%[0-9]*}}"

${numbers[0]} teria funcionado se cada caractere fosse um elemento separado na matriz numbers (e se o primeiro caractere fosse um dígito). Como numbers não é uma matriz, é equivalente a apenas $numbers .

    
por 02.04.2018 / 09:58
3

Você também pode usar o método abaixo

cat script.sh

   #!/bin/bash
echo $1 | awk '{print substr($1,1,1)}'



 sh script.sh 90

Where 90 is the user input

saída é 9

    
por 02.04.2018 / 06:39
1

com colrm

echo '901.32.02' | colrm 2
    
por 02.04.2018 / 12:46
0

Se você quiser detectar apenas dígitos (não outros tipos de caracteres), deve usar uma expressão regular simples.

[[ ${numbers} =~ ^([[:digit:]]) ]] && var=${BASH_REMATCH[1]}

Em $ var é um dígito ou está vazio (mesmo não declarado).

    
por 02.04.2018 / 20:48