Зациклить сценарий оболочки, если во входном файле больше входных данных

Ваш подход неуклюж (и, честно говоря, неверен). Для таких задач существуют специальные инструменты, find - один из них.

Например, чтобы найти все файлы в текущем каталоге, размер которых меньше 1 MiB (1048576 Bytes), рекурсивно:

find . -type f -size -1048576c

Или с помощью оболочек, предоставляющих такие классификаторы glob на основе размера, например zsh, рекурсивно:

print -rl -- **/*(.L-1048576)

Здесь, в отличие от find выше, без скрытых файлов. Добавьте классификатор D glob, чтобы включить их.

1
05.06.2017, 16:06
3 ответа
while IFS= read -r name && IFS= read -r number; do
   #IFS= read -r number || break
   printf 'Your name is %s and your number is %d\n' "$name" "$number"
done < answers.txt

Ваши мыслительные процессы были на правильном пути, нам нужно ввести цикл, цикл пока, условием которого являются команды чтения, объединенные И.

1
27.01.2020, 23:45

Команда read завершится ошибкой, когда больше не будет ввода, поэтому вы можете использовать ее как условие цикла:

#!/bin/sh
echo -n "Enter your name: "
while read name
do
  echo -n "Enter your number: "
  read number
  echo "Your name is $name and your number is $number"
done
0
27.01.2020, 23:45

Г-н. Ответ Шаллера хорош. Недостатком перенаправления ввода из файла является то, что ваш ручной ввод теперь также зависит от цикла, поэтому пользователи должны будут знать, что нужно нажать Enter (не вводить значение), чтобы завершить цикл. Вы можете использовать свою текущую логику для ручных запусков и сделать что-то вроде ниже, когда есть входной файл ($ 1), предоставленный скрипту (не перенаправленный).

Если вы уверены, что формат файла всегда будет "имя\номер\n", то вы можете сделать:

cntr=0
cat $1 | while read line
do
    if [ $cntr -eq 0 ]
    then
      name=$line
      cntr=1
    elif [ $cntr -eq 1 ]
      number=$line
      echo "Your name is $name and your number is $number"
      cntr=0
    fi
done

Это должно печатать ваше утверждение до тех пор, пока не будут прочитаны все комбинации имя/число.

0
27.01.2020, 23:45

Теги

Похожие вопросы