1

Am trying to get a substring from a string but am getting the error: ${curr_rec:3:4}: bad substitution

#!/bin/ksh

get_file_totals()
{

    if [ -e "$file_name" ]
    then
        IFS=''
        while read line
        do
        curr_rec=$line
        echo ${curr_rec:3:4}
        done < "$file_name"
    else

        echo "error"
    fi
}

file_name="$1"
get_file_totals
chaos
  • 47,463
  • 11
  • 118
  • 144
Nicholas Namacha
  • 109
  • 1
  • 1
  • 6
  • It's working for me. How do you call the script? – chaos May 27 '15 at 09:36
  • FWIW I get this error if I (wrongly) call the script like `sh myscript`. I can't reproduce it otherwise. – roaima May 27 '15 at 10:06
  • 1
    You may want to read [Why is using a shell loop to process text considered bad practice?](http://unix.stackexchange.com/q/169716). You've fallen in almost every trap there. – Stéphane Chazelas May 27 '15 at 10:54

2 Answers2

3

You're invoking ksh. The kind of substitution you are wanting to do works only since ksh '93. Is there a chance you are using an older version? Run ksh and check for the existence of KSH_VERSION. If it doesn't exist or is before '93, it's too old.

Otheus
  • 5,945
  • 1
  • 22
  • 53
1

It would be more efficient to rewrite this, thereby avoiding the issue in the first place:

#!/bin/ksh

get_file_totals()
{

    if [ -e "$file_name" ]
    then
        cut -c4-7 "$file_name"
    else
        echo "error"    # consider stderr by appending >&2
    fi
}

file_name="$1"
get_file_totals
roaima
  • 107,089
  • 14
  • 139
  • 261