Правильним позначенням для заміщення процесу є:
while read i; do echo $i; done < <(echo "$FILECONTENT")
Тоді останнє значення, i
призначене в циклі, стає доступним, коли цикл завершується. Альтернативою є:
echo $FILECONTENT |
{
while read i; do echo $i; done
...do other things using $i here...
}
Фігурні дужки - це операція групування вводу-виводу, яка сама по собі не створює під оболонку. У цьому контексті вони є частиною конвеєра і, отже, працюють як допоміжна оболонка, але це відбувається через |
, а не { ... }
. Ви згадуєте це у питанні. AFAIK, ти можеш зробити повернення зсередини всередині функції.
Bash також надає shopt
вбудовану програму, і одним із багатьох варіантів є:
lastpipe
Якщо встановлено, а керування завданнями не активне, оболонка запускає останню команду конвеєра, який не виконується у фоновому режимі в поточному середовищі оболонки.
Таким чином, використання подібного у сценарії робить модифіковану sum
доступною після циклу:
FILECONTENT="12 Name
13 Number
14 Information"
shopt -s lastpipe
sum=0
echo "$FILECONTENT" |
while read number name; do ((sum+=$number)); done
echo $sum
Роблячи це в командному рядку, зазвичай виникає помилка "контроль роботи неактивний" (тобто в командному рядку контроль роботи активний). Не вдалося перевірити це без використання сценарію.
Крім того, як зазначив Гарет Різ у своїй відповіді , іноді ви можете використовувати рядок тут :
while read i; do echo $i; done <<< "$FILECONTENT"
Для цього не потрібно shopt
; можливо, ви зможете зберегти процес, використовуючи його.