like i said, if time is a concern, i won't write shell scripts. Here's an awk version (which i hope its correct), if you consider awk an "external tool" as well.
BEGIN{
i=1
while ( i <= 1000 ){
var="abcde"
j=1
while ( j <= length(var) ){
if ( substr(var,j,1) == "a" ){
printf "%s", "m"
}else if (substr(var,j,1) == "b"){
printf "%s", "n"
}else if(substr(var,j,1) == "c") {
printf "%s", "o"
}else if(substr(var,j,1) == "d") {
printf "%s", "p"
}else if(substr(var,j,1) == "e") {
printf "%s", "q"
}else if(substr(var,j,1) == "f") {
printf "%s", "r"
}else if(substr(var,j,1) == "g") {
printf "%s", "s"
}else if(substr(var,j,1) == "h") {
printf "%s", "t"
}else if(substr(var,j,1) == "i") {
printf "%s", "u"
}else if(substr(var,j,1) == "j") {
printf "%s", "v"
}else if(substr(var,j,1) == "k") {
printf "%s", "w"
}else if(substr(var,j,1) == "l") {
printf "%s", "x"
}else if(substr(var,j,1) == "m") {
printf "%s", "y"
}else if(substr(var,j,1) == "n") {
printf "%s", "z"
}else if(substr(var,j,1) == "o") {
printf "%s", "a"
}else if(substr(var,j,1) == "p") {
printf "%s", "b"
}else if(substr(var,j,1) == "q") {
printf "%s", "c"
}else if(substr(var,j,1) == "r") {
printf "%s", "d"
}else if(substr(var,j,1) == "s") {
printf "%s", "e"
}else if( substr(var,j,1) == "t") {
printf "%s", "f"
}else if(substr(var,j,1) == "u") {
printf "%s", "g"
}else if(substr(var,j,1) == "v") {
printf "%s", "h"
}else if(substr(var,j,1) == "w") {
printf "%s", "i"
}else if(substr(var,j,1) == "x") {
printf "%s", "j"
}else if(substr(var,j,1) == "y") {
printf "%s", "k"
}else if(substr(var,j,1) == "z") {
printf "%s", "l"
}
j++
}
print
i++
}
}
output:
# time awk -f testawk > /dev/null
real 0m0.022s
user 0m0.020s
sys 0m0.000s
I don't have ksh, so i used bash
iCnt=1
while [ $iCnt -le 1000 ] ; do
var="abcde"
j=0
while [ $j -le ${#var} ] ; do
case ${var:$j:1} in
a) printf "%s" "m" ;;
b) printf "%s" "n" ;;
c) printf "%s" "o" ;;
d) printf "%s" "p" ;;
e) printf "%s" "q" ;;
f) printf "%s" "r" ;;
g) printf "%s" "s" ;;
h) printf "%s" "t" ;;
i) printf "%s" "u" ;;
j) printf "%s" "v" ;;
k) printf "%s" "w" ;;
l) printf "%s" "x" ;;
m) printf "%s" "y" ;;
n) printf "%s" "z" ;;
o) printf "%s" "a" ;;
p) printf "%s" "b" ;;
q) printf "%s" "c" ;;
r) printf "%s" "d" ;;
s) printf "%s" "e" ;;
t) printf "%s" "f" ;;
u) printf "%s" "g" ;;
v) printf "%s" "h" ;;
w) printf "%s" "i" ;;
x) printf "%s" "j" ;;
y) printf "%s" "k" ;;
z) printf "%s" "l" ;;
esac
(( j += 1 ))
done
echo
(( iCnt += 1 ))
done
I think it resembles the ksh version so here's the test
# time ./test.sh > testshell.txt
real 0m1.041s
user 0m0.956s
sys 0m0.080s
# time awk -f testawk > testawk.txt
real 0m0.022s
user 0m0.020s
sys 0m0.000s
# diff testawk.txt testshell.txt
#
I may be wrong