Кошка Баша, пока арт и труба ведут к странному поведению - PullRequest
3 голосов
/ 21 ноября 2010

Итак, вот мой сценарий:

count=0
cat myfile | while read line
do
    #some stuff...
    let count++
    echo $count
done
echo $count

Последний оператор echo выводит 0 вместо числа строк в файле, хотя оператор echo в цикле while печатает возрастающее значение.

Проблема в трубопроводе, потому что при простом цикле while последний оператор echo выводит правильное значение.Как я могу заставить это работать?

Ответы [ 2 ]

4 голосов
/ 21 ноября 2010

В Bash вы можете использовать подстановку процесса и избежать временного файла, а переменные в цикле 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
2 голосов
/ 21 ноября 2010

При использовании каналов создается новая подоболочка, и все переменные в ней теряются после нее.Вместо этого используйте следующий код:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...