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
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
.
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
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
.
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
com colrm
echo '901.32.02' | colrm 2
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).