Array Variable being Assigned Values in Loop, But Gone when Loop Completes???

Hello All,

Maybe I'm Missing something here but I have NOOO idea what the heck is going on with this....?

I have a Variable that contains a PATTERN of what I'm considering "Illegal Characters". So what I'm doing is looping
through a string containing some of these "Illegal Characters". Now when these chars are found I add them to the Array
variable, and on the very next line (while still in the same if statement, inside the loop) I print the Array Element which
shows the correct value inside that particular element.

Now after the loop completes I'm trying to print the array with a 'for' loop and for some reason its treating the array as
if it were empty, and I have NO idea why this is happening...?

Here's the Section that isn't working correctly:

#!/bin/bash

declare -a FOUND_CHARS

ILLEGAL_CHARS="[\|\`\&\>\<\'\\\"\{\}\;\!]"    #--> CONTAINS ANY 1 OF:  | ` & > < ' \ " \ \ { } ; !
ILLEGAL_CHARS_2="\[|\]"                       #--> CONTAINS ANY 1 OF:  [  ]

### FOUND 6 Total Illegal Characters in this Test String "$MY_STR"
# CHARS ARE: {, }, &, <, >, and !
MY_STR="{SOME & STRING WITH ! A COUPLE ILLEGAL <CHARS>}"
echo -e "MY_STR = \"$MY_STR\""

count=0
echo -n "$MY_STR" | while read -n 1 char
 do
    if [[ "$char" =~ $ILLEGAL_CHARS  || "$char" =~ $ILLEGAL_CHARS_2 ]]
     then
        FOUND_CHARS[$count]="$char"
        echo -ne "  ILLEGAL char --> \"$char\"\n"
        echo -ne "FOUND_CHARS[$count] --> \"${FOUND_CHARS[$count]}\"\n"
        let count++
    else
        echo -ne "\tLEGAL CHARACTER --> \"$char\"\n"
    fi
done

echo -e "\n\n"

for sym in ${FOUND_CHARS[@]}
echo "Array Contains:"
 do
    echo -e "\tsym == $sym"
done

Below is the Output.
The Output from the "while" loop is CORRECT. But then after that "while" loop is done, then it's the "for" loop's turn and it
prints NOTHING...

Here's the Output:

MY_STR = "{SOME & STRING WITH ! A COUPLE ILLEGAL <CHARS>}"


  ILLEGAL char --> "{"
FOUND_CHARS[0] --> "{"
    LEGAL CHARACTER --> "S"
    LEGAL CHARACTER --> "O"
    LEGAL CHARACTER --> "M"
    LEGAL CHARACTER --> "E"
    LEGAL CHARACTER --> ""
  ILLEGAL char --> "&"
FOUND_CHARS[1] --> "&"
    LEGAL CHARACTER --> ""
    LEGAL CHARACTER --> "S"
    LEGAL CHARACTER --> "T"
    LEGAL CHARACTER --> "R"
    LEGAL CHARACTER --> "I"
    LEGAL CHARACTER --> "N"
    LEGAL CHARACTER --> "G"
    LEGAL CHARACTER --> ""
    LEGAL CHARACTER --> "W"
    LEGAL CHARACTER --> "I"
    LEGAL CHARACTER --> "T"
    LEGAL CHARACTER --> "H"
    LEGAL CHARACTER --> ""
  ILLEGAL char --> "!"
FOUND_CHARS[2] --> "!"
    LEGAL CHARACTER --> ""
    LEGAL CHARACTER --> "A"
    LEGAL CHARACTER --> ""
    LEGAL CHARACTER --> "C"
    LEGAL CHARACTER --> "O"
    LEGAL CHARACTER --> "U"
    LEGAL CHARACTER --> "P"
    LEGAL CHARACTER --> "L"
    LEGAL CHARACTER --> "E"
    LEGAL CHARACTER --> ""
    LEGAL CHARACTER --> "I"
    LEGAL CHARACTER --> "L"
    LEGAL CHARACTER --> "L"
    LEGAL CHARACTER --> "E"
    LEGAL CHARACTER --> "G"
    LEGAL CHARACTER --> "A"
    LEGAL CHARACTER --> "L"
    LEGAL CHARACTER --> ""
  ILLEGAL char --> "<"
FOUND_CHARS[3] --> "<"
    LEGAL CHARACTER --> "C"
    LEGAL CHARACTER --> "H"
    LEGAL CHARACTER --> "A"
    LEGAL CHARACTER --> "R"
    LEGAL CHARACTER --> "S"
  ILLEGAL char --> ">"
FOUND_CHARS[4] --> ">"
  ILLEGAL char --> "}"
FOUND_CHARS[5] --> "}"



Array Contains:

As you can see in the Output, the 'while' the loop is looping through the string and it is printing the Illegal
Characters that it finds, and you can see that the variable inside the loop DOES contain the values...

So why is the array empty after the loop has completed?
Any thoughts would be much appreciated!

Thanks in Advance,
Matt

---------- Post updated at 04:45 PM ---------- Previous update was at 03:55 PM ----------

UPDATE:

Well this look like it has something to do with my "while" loop...
Maybe something like it's spawning a sub-process so when it returns from the sub-process that Array doesn't exist anymore?

If I put the text into a file and loop using this construct (below) instead of what I have now, the array contains the data
after it completes.

NEW LOOP CONSTRUCT:

MY_FILE="~/temp_textFile.txt"
echo "$MY_STR" > $MY_FILE

while read -n 1 char
 do
           ...... CODE .....
done < $MY_FILE

How can I do this without printing to a file first?
Seems like too much work for something as simple as looping through a string character-by-character..?

Thanks,
Matt

echo -n "$MY_STR" | while read ...

The main shell forks off a copy of itself to run while read independently of the echo so they can both run while connected by a pipe. The copy, or "sub-shell", runs successfully, setting all your variables and such as you please, until the pipe runs out of information and returns EOF. Then the loop quits.

Then the subshell dies. Control is returned to the main shell, which remains unchanged. You set all your variables in the subshell, not the main one.

In short: It's the pipe that does it. Your shell and everything behind the pipe are different processes and don't share variables.

Pipes are overkill if you have substring operators anyway. This way of getting a single character ought to work identically in bash and ksh:

N=0

while [ "$N" -lt "${#STRING}" ]
do
        echo "${STRING:$N:1}"
        let N=N+1
done

Hey Corona, thanks for the reply!

Thanks, thats kinda what I had read... About the forking.

I'm not at my desk anymore, but as soon as I get in tomorrow
I'll give it a try and post back with my results.

Would it also be possible to set the IFS to something like "."
or "*" and then do the for loop like this:

IFS="*"
for char in "$MY_STR"
 do
         ..... Code ......
done

Would something like that work too?

Thanks Again,
Matt

Afraid not. "${STRING:$N:1}" works fine, though.

or if your old ksh (ksh88) doesn't support the '${STRING:n:m}' paradigm:

#!/bin/ksh
MyString=abcde
i=0
while (( i++ < ${#MyString} ))
do
   char=$(expr substr "$MyString" $i 1)
   echo "<$char>"
done

Hey Corona, thanks again for the reply.

Ok, thanks for the clarification...

Hey vgersh99, thanks for your reply.

Cool, another good example. Thanks!

Thanks Again for your Replies,
Matt

---------- Post updated at 10:00 AM ---------- Previous update was at 09:29 AM ----------

Hey Corona, just gave your example a try and it works perfectly..!

Thanks Again,
Matt