ash

How to use array in ash?


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?


Solution

  • 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