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