Como posso imprimir a enésima linha de um arquivo e detectar se o processo falhou?

0

Eu tenho um arquivo chamado namelist com nomes como este:

george
cindy
chester

Estou usando nl namelist para produzir:

1 george
2 cindy
3 chester

Eu quero usar essa lista de nomes em um script que contém algo assim:

while [ true ]; do
read -p "Who are you? " NAMEID
NAME="$(sed ''"$NAMEID"'q;d' namelist)
if $NAME; 
    then
        echo "Hello."
        return
    else
        echo "Sorry, that's not a valid name."
fi
done

em que $NAMEID tem valores válidos de 1, 2 e 3. Gostaria que $NAME fosse falso se $NAMEID fosse algo diferente de 1, 2 ou 3, como 97 ou fasdhj. sed sempre me dá um valor de saída de 0 . awk 'NR==$NAMEID {print; err = 1}' namelist faz o mesmo.

Agora mesmo estou usando o OS X 10.11, mas estou planejando usar o Ubuntu 16.04 quando terminar o script.

    
por aswine 19.08.2016 / 18:22

2 respostas

1

Altere sua definição de variável NAME para que ela retorne o nome da pessoa e possamos testá-la. O primeiro pensamento pode ser algo como

NAME="$(sed -n "${NAMEID}p" namelist)"

Mas isso tem problemas potenciais com o NAMEID contendo dados inválidos (e se alguém digitar "olá" ou "-10" ...).

Então, em vez disso, usaremos awk :

NAME="$(awk -vNAMEID="$NAMEID" 'NR==NAMEID { print ; exit }' namelist)"

Agora, estará vazio se o valor estiver fora do intervalo ou mantenha o nome do usuário.

$ cat namelist
george
cindy
chester

$ cat tstscript
getname()
{
  while [ true ]; do
    read -p "Who are you? " NAMEID
    NAME="$(awk -vNAMEID="$NAMEID" 'NR==NAMEID { print ; exit }' namelist)"

    if [ -n "$NAME" ]
    then
      echo "Hello $NAME."
      return
    else
      echo "Sorry, that's not a valid name."
    fi
  done
}

getname

$ bash tstscript 
Who are you? 4
Sorry, that's not a valid name.
Who are you? hello
Sorry, that's not a valid name.
Who are you? -45
Sorry, that's not a valid name.
Who are you? 2
Hello cindy.
    
por 19.08.2016 / 19:16
0

Com awk , POSIXly:

id=$NAMEID awk '$1 == ENVIRON["id"] {x = 1;print;}; END { exit !x}' <file

Exemplo:

$ echo 1 | id=1 awk '$1 == ENVIRON["id"] {x = 1;print;}; END { exit !x}'
1
$ echo "$?"
0

$ echo 1 | id=2 awk '$1 == ENVIRON["id"] {x = 1;print;}; END { exit !x}'
$ echo "$?"
1

Com o GNU sed :

sed -n -e "$NAMEID{p;q;}' -e '$q1'
    
por 19.08.2016 / 18:30