Como usar “read -i” no FreeBSD? (prefilling entrada de usuários)

1

Eu escrevi um script bash no CentOs, mas agora eu tenho um problema com esse script no FreeBSD.

Portanto, o problema está na diferença entre a função " read " no Linux e a função " read " no FreeBSD.

Esta é uma parte do meu script:

Tmp="an_num.tmp"
Tmpg=$(cat $Tmp)
Tmpi=$(expr $Tmpg + 1)
printf "${WONWARN} Please enter a number ${NORMAL} %s"
read -i "$Tmpi" -e Number; echo
echo "$Number" > "$Tmp"

Aqui eu recebo um número de an_num.tmp (este arquivo sempre contém apenas um número).

Então eu incremento este número e colocá-lo na variável Tmpi.

Depois disso, eu uso a função de leitura com pré-preenchimento (pré-preenchida com a variável Tmpi) e o usuário pode inserir um novo valor ou aceitar esse valor incrementado.

homem lido pelo CentOS:

-i text If readline is being used to read the line text is placed into the editing buffer before editing begins.

Mas " read " no FreeBSD não tem a mesma chave -i .

Como posso usar prefilling no sistema operacional FreeBSD? Obrigado.

$ uname -a FreeBSD srv 11.0-RELEASE-p1 FreeBSD 11.0-RELEASE-p1 #0 r306420: Thu Sep 29 01:43:23 UTC 2016 [email protected]:/usr/obj/usr/src/sys/GENERIC amd64

    
por Родинка 11.01.2018 / 08:22

1 resposta

2

Se o script for executado por bash em ambas as máquinas, não haverá problema (pelo menos não se as versões instaladas do shell suportarem read -i e qualquer outro recurso bash -específico que o script possa uso).

Certifique-se de que o script tenha uma #! -line adequada apontando para o executável bash em cada sistema.

Notas sobre o código:

Tmp="an_num.tmp"
Tmpg=$(cat $Tmp)       # may be replaced with Tmpg=$(<"$Tmp")
Tmpi=$(expr $Tmpg + 1) # may be replaced with Tmpi=$(( Tmpg + 1 ))

printf "${WONWARN} Please enter a number ${NORMAL} %s"
# The above lacks a value for the %s format string

read -i "$Tmpi" -e Number; echo
echo "$Number" > "$Tmp"

Implementação alternativa (ainda bash -specific, mas funciona com versões mais antigas, pois evita read -i e valida que o valor lido do usuário é na verdade um número / número decimal):

tmp_fname="an_num.tmp"

read num <"$tmp_fname"
num=$(( num + 1 ))

read -p 'Enter number: '

if [[ -n "$REPLY" ]] && [[ "$REPLY" =~ ^[0-9]*$ ]]; then
    num=$REPLY
fi

echo "$num" >"$tmp_fname"
    
por 11.01.2018 / 11:28