Ваш скрипт отлично работает для меня в Linux с ksh 93t +.
Так как это один и тот же сценарий, и вы получаете схожие ошибки в двух разных средах, я бы заподозрил случайные символы в файле. Попробуйте один из них, чтобы показать любые случайные символы, которые могут присутствовать:
hd filename
cat -v filename
hexdump -C filename
Если это просто вопрос окончания строки DOS, то это исправит:
dos2unix filename
Edit:
Вот один из способов создания и заполнения ассоциативного массива в ksh:
$ typeset -A testvar
$ testvar=([one]="motherlode" [two]="vein" [waste]="tailings")
$ echo ${testvar[two]}
vein
$ testvar[ore]="gold"
$ echo ${!testvar[@]} # print the indices of the array
one two waste ore
$ typeset -p testvar # show the current definition of the array
typeset -A testvar=([one]="motherlode" [two]="vein" [waste]="tailings" [ore]="gold")
Как вы можете видеть, ksh использует заключенные в скобки индексы для массивов. Пунктирная запись используется для доступа к членам составной переменной .
Я не верю, что функции ksh могут возвращать массивы. Однако вы можете использовать технику печати, которая есть в вашей функции (но добавьте квадратные скобки вокруг имени индекса), и использовать eval
для выполнения назначения.
$ typeset -A testvar
$ eval "testvar=($(testfunc))"
или добавить в существующий массив:
$ eval "testvar+=($(testfunc))"
Если ваша функция не использует ассоциативные массивы внутри, вам не обязательно использовать их для построения выходных данных.
Однако, если вы это сделаете, вы можете проанализировать результат typeset -p
:
$ result=$(typeset -p env)
$ result=${result#*\(}
$ result=${result%\)*}
$ print result
или перебрать массив:
$ for index in ${!env[@]}; do print -n "[$index]=${env[$index]} "; done; print
Вы можете обратиться к документации, касающейся дисциплинарных функций и переменных типа