Reading a variable line by line with while loop
Loïc Grenié
loic.grenie at gmail.com
Tue Dec 1 16:22:50 UTC 2009
2009/12/1 Ray Parrish <crp at cmc.net>:
> Ray Parrish wrote:
>> Loïc Grenié wrote:
>>
>>> 2009/12/1 Ray Parrish <crp at cmc.net>:
>>>
>>>
>>>> Hello,
>>>>
>>>> I have been using while loops to read files in line by line when I want
>>>> to process things on a line oriented basis. Sometimes i have the set of
>>>> lines I want to read through already in a variable, and have to write
>>>> them to file before beginning to read line by line.
>>>>
>>>> I was wondering if it is possible to read a variable line by line
>>>> somehow with a while loop? Would it possibly be faster than using a file
>>>> to read from?
>>>>
>>>> I was thinking something along the lines of the following code might
>>>> work, but have not tested it yet.
>>>>
>>>> while read ThisLine; do
>>>> # process each line
>>>> echo "$ThisLine"
>>>> done < `echo "$Variable"`
>>>>
>>>> Is this something that might work, and would it be more efficient than
>>>> writing to, and reading from a file? Is there some other way I've missed
>>>> to make it work?
>>>>
>>>>
>>> This will probably not work.
>>>
>>> echo "$Variable" | while read
>>> ...
>>> done
>>>
>>> has better chances of working.
>>>
>>> Loïc
>>>
>>>
>> Well, that one test worked, but I cannot get the following to work -
>>
>> # Read bash history into a variable for use with combobox call
>> History=""
>> BashHistory=`cat ~/.bash_history`
>> echo "$BashHistory" | while read ThisCommand; do
>> # Replace spaces in each command line with __ [double underlines]
>> ThisCommand=${ThisCommand// /__}
>> # Concatenate the results to the Command variable
>> History="$History $ThisCommand"
>> done
>> echo "History - $History"
>>
>> The last echo command returns nothing, but if I put an echo command in
>> the loop either before, or after the replace spaces command, it echoes
>> every line of the variable to the console.
>>
>> Does anyone have any idea why it's not working because I am stumped...
>>
>> Later, Ray Parrish
>>
> Hello again,
>
> OK, I understand that the | is causing a sub shell to execute for the
> echo command, so the variable $History even 'though declared globally,
> is local to the loop with the pipe, and therefore not available after
> the loop exits.
>
> I have tested this by putting an echo "History - $History" command right
> after the concatenation line in the loop. This causes some pretty slow
> execution as the extremely long string get echoed over and over again,
> but showed that the variable was indeed getting updated each time
> through the loop.
>
> Does anyone know how to fix my code so it can access the value of the
> $History variable after the loop exits?
You might need to adjust the ; but something along the
lines of:
echo "$BashHistory" | (while read ThisCommand; do
ThisCommand=${ThisCommand// /__};
History="$History $ThisCommand";
done;
echo "History - $History")
I don't know what you want to do but:
a=`cat file`
echo "$a" | whatever
is a strange way to do
cat file | whatever
or
whatever < file
In case of a loop
while read command
do
anything with $command
done < file
will do.
Loïc
More information about the ubuntu-users
mailing list