HowTo: Bash Shell Split String Into Array

last updated in Categories , ,

How do I split string based on delimiter into array under Bash shell?

You need to use the $IFS. It is a special shell variable. You can change the value of IFS as per your requirements. The Internal Field Separator (IFS) that is used for word splitting after expansion and to split lines into words with the read builtin command. The default value is <space><tab><newline>. You can print it with the following command:
cat -etv <<<"$IFS"

$IFS variable is commonly used with read command, parameter expansions and command substitution.


Create a variable called ns as follows:


To split $ns variable (string) into array, use the following IFS syntax:

IFS=' '
read -a dnsservers <<< "${ns}"

OR use one liner as follows:

IFS=' ' read -a dnsservers <<< "${ns}"

To display values stored in an array, enter:

echo ${dnsservers[0]}

Sample outputs:

Use bash for loop to iterate through array values i.e. print all elements using bash for loop syntax:

for i in "${dnsservers[@]}"
   echo "$i"

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin, DevOps engineer, and a trainer for the Linux operating system/Unix shell scripting. Get the latest tutorials on SysAdmin, Linux/Unix and open source topics via RSS/XML feed or weekly email newsletter.

6 comment

  1. You could also do:

    # ${ns} becomes an array:
    echo ${ns[1]}  ${ns[2]}  ${ns[3]}
  2. ns=””



    for i in $ns;do A[$n]=$i; ((n++));done

    echo ${A[0]}
    echo ${A[1]}
    echo ${A[2]}
    echo ${A[3]}

  3. Just FYI:

    “The default value is .”

    That stmt got messed-up in the html-formatting of your article.
    I can see in the html-code, you meant to write:
    “The default value is (space)(tab)(newline).”
    which is correct :)

  4. As the guy above me said, space,tab,newline are the default delimiters.
    If your input string is already separated by spaces, bash will automatically put it into an array:
    array=( H E L L O ) # you don’t even need quotes
    array[0] $ = H

    if you wanted to accept other ascii chars (say you’re converting to hex for some reason)
    array=(H E L L O “#” “!” ) #some chars you’ll want to use the quotes

    cat test.txt
    test1 test2 test3

    array=($( cat test.txt ))
    array[0] = test1

    array=($( ls directory/ )) #ls by default will output each dir on a new line, so each subdir or whatever ls returns becomes an array element

    array[0] = /home/user

    One last thing: array=( ${array[@]} “test” ) will add “test” string to an array. Say if you wanted to add the result of a bunch of different directories…
    array=( ${array[@]} “`ls /home/`” “`ls /home/user`” “`ls /proc/sys/`” ) and so on, note the ` backtics ` this time.

    Still, have a question? Get help on our forum!