Reading a variable line by line with while loop
Ray Parrish
crp at cmc.net
Tue Dec 1 17:30:39 UTC 2009
Loïc Grenié wrote:
> 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")
>
This worked great! Thanks for teaching me how to read a variable line by
line, the semi-colons did the trick, and now I can access the variable
contents after the loop is over.
> I don't know what you want to do but:
>
> a=`cat file`
> echo "$a" | whatever
>
> is a strange way to do
>
Well, I often find myself with a file already loaded in a variable, or
have built up a line oriented set of data in a variable without it
having been in a file in the first place, so I am under the half-baked
impression that handling the variable's data directly instead of
flushing to, and re-reading from a file would be more efficient.
Thanks again for the help.
Later, Ray Parrish
--
The Future of Technology.
http://www.rayslinks.com/The%20Future%20of%20Technology.html
Ray's Links, a variety of links to usefull things, and articles by Ray.
http://www.rayslinks.com
Writings of "The" Schizophrenic, what it's like to be a schizo, and other
things, including my poetry.
http://www.writingsoftheschizophrenic.com
More information about the ubuntu-users
mailing list