Подскажите пожалуйста, нужно парсить вывод утилиты smbclient -gNL $ip, находить в выводе сервер samb`ы и его шары, но приходится сначала сливать вывод smbclient в tmp файл (так-как если испоьзовать конвеер переменные за циклом не будут сохраняться из-за subshell`a), чтобы его потом построчно разобрать в теле цикла и передавать результаты в переменные для дальнейших действий в функцию, вопрос заключается в том можно ли убрать tmp файл, используя каким нибудь образом конвеер, так-как ip много, нехочется делать лишнюю нагрузку на файловую систему, да и некрасиво это как мне кажется!?
p.s. пишу на shell, a не на bash, поэтому перенаправление в стиле "done < <(чего-то там)" не работает.
while read line
do
object=`echo $line|awk -F"|" '{print $1}'`
case "$object" in
Disk)
tmp=`echo $line|awk -F"|" '{print $2}'`
dsk="$tmp $dsk"
;;
IPC)
ipc=`echo $line|awk '{print $3}'|tr -d "()"`
;;
Server)
echo $line|grep -q $ipc
if [ $? -eq 0 ]
then
srv=`echo $line|awk -F"|" '{print $2}'`
fi
;;
esac
done < $ip.smb
0 cheusov>printf 'Всё\nработает\n' | { while read l; do ret="$ret $l"; done; echo $ret; }
Всё работает
0 0 cheusov>
> 0 cheusov>printf 'Всё\nработает\n' | { while read l; do ret="$ret $l"; done;
> echo $ret; }
> Всё работает
> 0 0 cheusov>Вопрос в том что если поместить то что вы написали в скрипт, то вне тела цикла while, переменная $ret будет пустой, мне же нужно чтобы переменная была доступна вне цикла, но это невозможно из-за конвеера
поробуйте запустить такой вариант и поймете о чем я говорю:#!/bin/sh
printf 'Всё\nработает\n' | { while read l; do ret="$ret $l"; done; echo $ret; }
echo $ret
> #!/bin/sh
> printf 'Всё\nработает\n' | { while read l; do ret="$ret $l"; done; echo
> $ret; }
> echo $retВопрос задать, конечно, можно, но надо же немного думать и над ответом.
Фигурные скобки там, где я их поставил, для чего стоят?
Спасибо разобрался, совсем забыл про блок!