Локальные переменные после выхода из цикла
9236 просмотра
5 ответа
У меня возникли некоторые проблемы с локальными переменными после выхода из цикла. Переменная max
заканчивается значением 0, несмотря на код ниже:
max=0
cat tmp|while read line
do
temp=$(echo $line|tr -d "\n"|wc -c)
if [ $temp -gt $max ];then
max=$temp
echo $max
fi
done
echo -n tmp $max
cat tmp
12345
123456
И это вывод, который я получаю:
5
6
tmp 0
Я не понимаю, почему max
0 после выхода из цикла, в то время как внутри цикла он находит правильные значения.
Ответы (5)
13 плюса
Труба запускает новую подоболочку с собственным окружением и переменным пространством. Используйте < tmp
вместо этого в конце цикла.
3 плюса
max=0
while read line
do
temp=$(echo $line|tr -d "\n"|wc -c)
if [ $temp -gt $max ]
then
max=$temp
echo $max
fi
done <tmp
echo -n tmp $max
Автор: Paul Creasey
Размещён: 13.01.2010 08:55
3 плюса
Согласно справочной странице bash каждая команда в конвейере выполняется в подоболочке. То есть ваш цикл while выполняется в подоболочке, и изменяется только значение переменной max в этой подоболочке.
Переменные подоболочек не передаются обратно вызывающей оболочке, которая выполняет команду echo и, таким образом, все еще видит начальное нулевое значение.
Если вы запустите echo в той же подоболочке (обратите внимание на фигурные скобки), она будет работать:
max=0
cat tmp|{
while read line
do
temp=$(echo $line|tr -d "\n"|wc -c)
if [ $temp -gt $max ];then
max=$temp
fi
done
echo -n tmp $max
}
Если вам нужно значение для дальнейших вычислений во внешней оболочке, вам нужно будет использовать подстановку команд следующим образом:
max=0
max=$(cat tmp|{
while read line
do
temp=$(echo $line|tr -d "\n"|wc -c)
if [ $temp -gt $max ];then
max=$temp
fi
done
echo -n $max
})
echo tmp $max
Автор: lwho
Размещён: 13.01.2010 09:14
1 плюс
Канал перед вашим временем помещает все внутри цикла в отдельную оболочку и, таким образом, в отдельный контекст идентификатора (по сути, в новую среду).
Перенаправление tmp
файла в while
цикл с помощью <
будет держать ваш цикл и переменные в одном контексте выполнения.
while read line
do
# your loop stuff
done < tmp
Автор: dustmachine
Размещён: 13.01.2010 08:56
0 плюса
Вот один вкладыш в awk.
$ awk 'length>t{t=length}END{print t}' file
6
Автор: ghostdog74
Размещён: 14.01.2010 12:06
Вопросы из категории :
- bash Как разрешить символические ссылки в сценарии оболочки
- bash Удалить все, кроме самых последних файлов X в Bash
- bash Распараллелить скрипт Bash с максимальным количеством процессов
- bash Как мне написать цикл для Bash
- bash Как обнулить числа в именах файлов в Bash?
- bash Get the source directory of a Bash script from within the script itself
- bash Как я могу отправить стандартный вывод одного процесса нескольким процессам, используя (желательно безымянные) каналы в Unix (или Windows)?
- bash Обработка ошибок в Bash
- bash Как подавить прекращение сообщения после убийства в bash?
- bash sudo echo "что-то" >> / etc / privilegedFile не работает
- bash Определить, существует ли функция в bash
- bash Проверка из сценария оболочки, если каталог содержит файлы
- bash Проблема с перенаправлением вывода Bash
- bash Область видимости переменной Bash
- bash Как удалить суффикс файла и часть пути из строки пути в Bash?
- bash Установка переменных среды в OS X
- bash bash: запускать несколько цепочек команд в фоновом режиме
- bash Как мне перебрать диапазон чисел, определенных переменными в Bash?
- bash Как проверить синтаксис скрипта Bash без его запуска?
- bash Быстрая команда Unix для отображения определенных строк в середине файла?