Ваш подход неуклюж (и, честно говоря, неверен). Для таких задач существуют специальные инструменты, find
- один из них.
Например, чтобы найти все файлы в текущем каталоге, размер которых меньше 1 MiB (1048576 Bytes), рекурсивно:
find . -type f -size -1048576c
Или с помощью оболочек, предоставляющих такие классификаторы glob на основе размера, например zsh
, рекурсивно:
print -rl -- **/*(.L-1048576)
Здесь, в отличие от find
выше, без скрытых файлов. Добавьте классификатор D
glob, чтобы включить их.
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
Ваши мыслительные процессы были на правильном пути, нам нужно ввести цикл
, цикл пока
, условием которого являются команды чтения
, объединенные И.
Команда 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
Г-н. Ответ Шаллера хорош. Недостатком перенаправления ввода из файла является то, что ваш ручной ввод теперь также зависит от цикла, поэтому пользователи должны будут знать, что нужно нажать 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
Это должно печатать ваше утверждение до тех пор, пока не будут прочитаны все комбинации имя/число.