'cat * mixes up the order of files

Right now, I am working on a "Text Editor" made with Bash. Everything was going perfectly until I tested it. When I opened the file the script created, everything was jumbled up. I eventually figured out it had something to do with the cat BASHTE/* >> $file I had put in. I still have no idea why this happens. My crappy original code is below:

#!/bin/bash
# ripoff vim
clear
echo "###############################################################################"
echo "#  BASHTE TEXT EDITOR -  \\\ = interupt  :q = quit  :w = write                 #"
echo "#  :wq = Write and quit  :q! = quit and discard  :dd = Delete Previous line   #"
echo "###############################################################################"
echo ""
read -p "Enter file name: " file
touch .$file
mkdir BASHTE
clear
echo "###############################################################################"
echo "#  BASHTE TEXT EDITOR -  \\\ = interupt  :q = quit  :w = write                 #"
echo "#  :wq = Write and quit  :q! = quit and discard  :dd = Delete Previous line   #"
echo "###############################################################################"



while true
do  
    read -p "$lines >" store
    if [ "$store" = "\\:q" ]
    then
        break
    elif [ "$store" = "\\:w" ]
    then
        cat BASHTE/* >> $file
    elif [ "$store" = "\\:wq" ]
    then
        cat BASHTE/* >> $file
        rm -rf .$file
        break
    elif [ "$store" = "\\:q!" ]
    then
        rm -rf BASHTE
        rm -rf $file
        break

    elif [ "$store" = "\\:dd" ]
    then
    LinesMinusOne=$(expr $lines - 1)
    rm -rf BASHTE/$LinesMinusOne.txt
    else

        echo $store >> BASHTE/$lines.txt
        # counts the number of times the while loop is run
        ((lines++))
    fi
done

This is what I got after I typed in the alphabet:

b
j
k
l
m
n
o
p
q
r
s
c
t
u
v
w
x
y
z
d
e
f
g
h
I

This was what I inputted

a
v
c
d
e
f
g
h
I
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
\\:wq

Any help would be great, Thanks



Solution 1:[1]

BASHTE/* is in lexical order, so every line starting with 1 will come before every line starting with 2 and so on. That means the order of your input lines is:

1 a
10 j
11 k
12 l
...and so on...

To make the lines sort well with the * operator, you'll need to name them with leading zeros, for example:

# ...
echo $store >> BASHTE/$(printf %020d $lines).txt
# ...

I chose the %020d format because it should store any number of lines applicable for a 64-bit system, since 2 ** 64 = 18446744073709551616, which is 20 digits long.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Pi Marillion