ksh разделить строку на массив для записи в файл

Вот код, который я использую для выбора строки из базы данных. Разделить, а затем записать в текстовый файл.

#Get information from DB for the given entrynum
RETVAL=`sqlplus -s username/pwd@db <<EOF
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT  (entrynum|| '-'||path||'-'|| syear||'-'|| eyear||'-'|| type) as RET
    FROM  entrydetails WHERE entrynum = 123;

EXIT;
EOF`    

print "$scriptname return value :$RETVAL " 1>&2
#Output :123-/userx/data/tt-2015-2015-1

#split each value into an array
arr=$(echo $RETVAL | tr "-" "\n")

#write to text variable
writeText="export entrynum=${arr[0]}\n
          export path=${arr[1]}\n
          export Syear=${arr[2]}\n
          export eyear=${arr[3]}\n
          export type=${arr[4]}";

#write text to file
echo $writeText > ../in/log_file

Вывод, который я получаю в файле,

export entrynum=123 /userx/data/1 2015 2015 1
 export path=
 export syesr=
 export eyear=
 export type=

Ожидаемый результат

export entrynum=123   
export path=/userx/data/1
export syesr=2015
export eyear=2015 
export type=1

person xGen    schedule 15.12.2015    source источник


Ответы (1)


Вам нужна еще одна пара скобок вокруг назначения массива

arr=($(echo $RETVAL | tr "-" "\n"))

$() является оценкой. arr=() является составным присвоением. Split находится на пробеле, поэтому вы можете просто использовать пробел, а не новую строку, чтобы tr вот так

tr "-" " "

если ваш ksh не поддерживает составное назначение, вы можете использовать set -A

set -A arr -- $(echo $RETVAL | tr "-" " ")

person cms    schedule 15.12.2015
comment
это работает для меня -- версия ksh sh (AT&T Research) 93u+ 2012-08-01 - альтернативой является использование явного набора - я обновил ответ, чтобы проиллюстрировать это - person cms; 15.12.2015
comment
попробовал это, чтобы проверить версию [ echo "\c" | grep c ] && echo ksh93 || эхо кш88. Это кш88. Тем не менее я получаю ту же ошибку - person xGen; 15.12.2015
comment
да, вам нужно 93 для =(). Я обновил ответ, чтобы предложить альтернативу - person cms; 15.12.2015