Bash function to produce variants of images at 2X and 3X resolutions
Double-quote variables used as command line arguments

Instead of this:


convert $1 -crop $2 "two.png"



Write like this:

convert "$1" -crop "$2" "two.png"


This is to protect from word splitting and glob expansion.

Double quote... naturally

This is hard to read and confusing:


Final=$One"X"$Two"+"$Three"+"$Four



I suggest to write like this:

Final="${One}X$Two+$Three+$Four"


Use better variable names

It's really hard to make sense of a program that uses variable names like First, Fourth, Second, Lhs, that don't reveal their purpose.

Also, the convention is to use lowercase names, without capitalizing the first letters.

Chopping off characters case insensitively

Instead of detecting if the delimiter is x or X and storing it in a variable,
you could use the pattern [xX], for example:

width=${spec%%[xX]*}


For example if you have 200x300 or 200X300 in spec, width becomes 200.
(Do take note of the meaningful names.)

Floating point math in the shell

Unfortunately Bash doesn't do floating point math.
It would give you a syntax error if you tried to multiply something by 1.5.
On the other hand, if you want to multiply by 1.5, and you don't mind truncating decimal points (as is the case here), you could multiply by 3 and divide by 2.

That is, instead of this:

width=$(bc &lt;&lt;&lt; "$width * 1.5")


You could write:

((width = width * 3 / 2))


Use here strings

Instead of echo ... | cmd, write cmd &lt;&lt;&lt; "...".