به جای کنترل یک حلقه با بررسی نتیجه یک فرمان یا توسط ورودی کاربر، میتوانیدفایلی را برای خواندن ورودی که حلقه را کنترل میکند تعیین کنید. در چنین حالاتی غالباً read دستور کنترلی است. تا موقعی که حلقه از سطرهای ورودی تغذیه میشود، اجرای دستورات حلقه ادامه مییابد. به محض اینکه سطرها خوانده شدند حلقه خارج میشود.
چونکه ساختار حلقه به گونهای در نظر گرفته شده که یک ساختار دستور باشد( از قبیل:
while TEST-COMMAND; do CONSEQUENT-COMMANDS; done)، تغییر مسیر بعد از جمله done صورت میگیرد،به طوری که به صورت زیر ترجمه میشود
command <
file
این نوع تغییر مسیر با انواع دیگر حلقهها نیز کار میکند.
در مثال زیر، خروجی فرمان find به عنوان ورودی فرمان read کنترلی حلقه while به کار رفته است:
[carol@octarine ~/testdir]
catarchiveoldstuff.sh
#!/bin/bash # This script creates a subdirectory in the current directory, to which old # files are moved. # Might be something for cron (if slightly adapted) to execute weekly or # monthly. ARCHIVENR=`date +%Y%m%d` DESTDIR="$PWD/archive-$ARCHIVENR" mkdir "$DESTDIR" # using quotes to catch file names containing spaces, using read -d for more # fool-proof usage: find "$PWD" -type f -a -mtime +5 | while read -d $'\000' file do gzip "$file"; mv "$file".gz "$DESTDIR" echo "$file archived" done
فایلها قبل از اینکه به دایرکتوری بایگانی منقل شوند متراکم گردیدهاند.