Enquanto looping inteiros

0

Sou novo no Linux e estou fazendo um curso on-line que está me enlouquecendo. O professor fala e explica as coisas tão rápido que eu não consigo acompanhar mesmo se eu voltar atrás. Eu sei que isso pode ser tão simples para muitos de vocês aqui, mas a tarefa que eu preciso fazer é ...

  1. Nomeie o script while.sh.
  2. Peça ao usuário para inserir um número inteiro positivo. Você pode assumir que o usuário irá inserir um inteiro positivo (validação de entrada não é necessária).
  3. Use um loop while para imprimir todos os inteiros de 0 até e incluindo o número inteiro digitado. Cada inteiro deve ser impresso em uma linha sozinho e nada mais deve ser impresso.

O que tenho que fazer para fazer isso?

    
por user218863 02.03.2017 / 21:46

2 respostas

3

Como seu arquivo deve receber o nome while.sh , suponho que você queira usar a sintaxe sh .

Você precisará:

  • um comando para ler entrada. A maioria dos utilitários de texto pode fazer isso (é o que eles fazem por padrão). sh também tem um comando read builtin para ler a entrada em uma variável.
  • um comando para gravar saída e prompts. Muitos comandos para isso. O comando printf pode fazer isso e é construído na maioria dos sh intérpretes, mas como aqui, você deseja produzir várias coisas, você pode querer usar um comando que possa fazer isso várias vezes em um loop.
  • uma maneira de fazer aritmética inteira. Vários comandos para isso. sh também tem esse recurso criado na linguagem.

Por acaso, o comando awk pode fazer todos os itens acima e por acaso tem uma construção while() .

#! /bin/sh -
awk '
  BEGIN {printf "Please enter a positive integer number: "}
  {while(i <= $0) print i++; exit}'

Aqui, você não precisa realmente de sh , você poderia também escrever:

#! /usr/bin/awk -f
BEGIN {printf "Please enter a positive integer number: "}
{while(i <= $0) print i++; exit}

bc é outro comando que tem quase todos os 3. Falta a capacidade de ler a entrada do usuário, embora a implementação GNU o suporte como uma extensão:

#! /usr/bin/bc -q
"Please enter a prositive integer number: "
n = read()
i = 0
while (i <= n) i++
quit

Você também pode usar a construção while do shell e chamar vários comandos em um loop, mas isso é geralmente considerado uma prática ruim , é menos eficiente e contribui para código feio (também se você quisesse validar a entrada do usuário, awk fornece funcionalidade muito melhor do que os recursos internos do shell (a construção case )):

#! /bin/sh -
printf 'Please enter a positive integer number: ' || exit
IFS= read -r number || [ -n "$number" ] || exit
i=0; while [ "$i" -le "$number" ]; do
  printf '%s\n' "$i" || exit
  i=$((i + 1))
done

Ao lado de sh , que é executado até 3 + 2 × ( número + 2) comandos ( [ , read e printf , felizmente incorporados na maioria sh intérpretes)! Compare com a única invocação de comando com awk ou bc acima.

Observe também que vários sistemas possuem um comando chamado seq especificamente projetado para gerar sequências de números, um por linha (como seq 0 "$number" ). O script do shell (sendo shells antes de todos os interpretadores de linha de comando) é, antes de tudo, de chamar o (s) comando (s) certo (s) para a tarefa. Não é sobre programação, então eu acho estranho que seu professor peça para você usar o laço while do shell.

    
por 02.03.2017 / 23:22
2

Usando vi while.sh , crie um novo arquivo com este script:

#!/bin/bash

COUNTER=0

echo "Enter a integer positive number: "
read NUMBER

echo "Numbers from 0 to $NUMBER: "
while [ $NUMBER -ge $COUNTER ]; do
  echo $COUNTER
  ((COUNTER++))
done

Em seguida, use chmod +x while.sh para conceder a ele permissões de execução. Chame o script usando ./while.sh , digite o número inteiro e aperte enter (sem validações). Ele retorna:

user@Notebook:/tmp$ ./while.sh 
Enter a integer positive number: 
5
Numbers from 0 to 5: 
0
1
2
3
4
5

É importante que você leia os man docs para while, read, bash variable e comparison para entender melhor. Existem várias maneiras de fazer isso. Essa é apenas a mais simples.

[EDITAR] @ user218863, respondendo seu comentário para a lista de lojas, você pode tentar algo assim:

#!/bin/bash -

echo "Enter items separated by a space:"
IFS= read -r LIST

IFS=' ' # split on space only
set -o noglob # disable glob
for item in $LIST; do
   printf '%s\n' "$item" || break
done >> shopping_list
echo "List:"
cat shopping_list

Isso criará um arquivo chamado shopping_list com cada palavra digitada e cat o arquivo após o loop. Por favor, se as respostas lhe ajudaram, aceite então:)

    
por 02.03.2017 / 22:15