How to use array in ash?

ash
Lin picture Lin · Mar 27, 2015 · Viewed 9k times · Source

For some reason, I can't use bash to build my script, the only way to do it is with ash, I have this sms auto responder script, each reply must be at max 160 chacters long, it looks like this:

#!/bin/sh
    reply="this is a reply message that contains so many words so I have to split it to some parts"
    array="${reply:0:5} ${reply:5:5} ${reply:10:5} ${reply:15:5} ${reply:20:5}"
    for i in $array
    do
    echo "send sms with the message: $i"
    done

but it ends up like this:

send sms with the message: this
send sms with the message: is
send sms with the message: a
send sms with the message: reply
send sms with the message: mess
send sms with the message: age
send sms with the message: t

What I want is something like this:

send sms with the message: this 
send sms with the message: is a 
send sms with the message: reply
send sms with the message: messa
send sms with the message: ge th
send sms with the message: at co
send sms with the message: ntain

So it splits by the number of characters instead of splitting by words, how can I do that?

Answer

Adrian Frühwirth picture Adrian Frühwirth · Mar 27, 2015

Your array is not actually an array, but read http://mywiki.wooledge.org/WordSplitting for more info on that.

ash does not natively support arrays, but you can circumvent that by using set:

reply="this is a reply message that contains so many words so I have to split it to some parts"
set -- "${reply:0:5}" "${reply:5:5}" "${reply:10:5}" "${reply:15:5}" "${reply:20:5}"
for i; do
        echo "send sms with the message: $i"
done

-

send sms with the message: this
send sms with the message: is a
send sms with the message: reply
send sms with the message:  mess
send sms with the message: age t

There are many alternative solutions to this, here's one of them using fold to do the splitting work for you with the added advantage that it can break on spaces to make the messages a bit more readable (see man fold for more info):

reply="this is a reply message that contains so many words so I have to split it to some parts"
echo "${reply}" | fold -w 10 -s | while IFS= read -r i; do
        echo "send sms with the message: $i"
done

-

send sms with the message: this is a
send sms with the message: reply
send sms with the message: message
send sms with the message: that
send sms with the message: contains
send sms with the message: so many
send sms with the message: words so
send sms with the message: I have to
send sms with the message: split it
send sms with the message: to some
send sms with the message: parts