قطة باش ، في حين ، تدع الأنابيب تؤدي إلى سلوك النطاق الغريب
-
26-09-2019 - |
سؤال
إذن هذا نصي:
count=0
cat myfile | while read line
do
#some stuff...
let count++
echo $count
done
echo $count
إخراج آخر بيان صدى 0 بدلاً من عدد الخطوط الموجودة في الملف ، على الرغم من أن عبارة ECHO في الحلقة تطبع القيمة المتزايدة.
المشكلة هي مع الأنابيب ، لأنه ، مع حلقة بسيطة ، يطبع بيان الصدى الأخير القيمة الصحيحة. كيف يمكنني الحصول على هذا للعمل؟
المحلول
في باش ، يمكنك استخدام استبدال العملية وتجنب الملف المؤقت والمتغيرات في while
سيتم الاحتفاظ الحلقة.
count=0
while read -r line # you should almost always use -r
do
#some stuff...
(( count++ )) # alternative form
echo $count
done < <(tac myfile)
echo $count
نصائح أخرى
عند استخدام الأنابيب ، يتم إنشاء فرعي جديد ويتم فقد أي متغيرات فيه بعد ذلك. استخدم الكود التالي بدلاً من ذلك:
count=0
while read line
do
#some stuff...
let count++
echo $count
done < myfile
echo $count
مثال مع أمر: tac
:
count=0
# Create a random file
tmpfile=$(mktemp)
tac myfile > $tmpfile
while read line
do
#some stuff...
let count++
echo $count
done < $tmpfile
# remove temp file
rm $tmpfile
echo $count
لا تنتمي إلى StackOverflow