قطة باش ، في حين ، تدع الأنابيب تؤدي إلى سلوك النطاق الغريب

StackOverflow https://stackoverflow.com/questions/4237048

  •  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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top