ksh membagi string ke array untuk menulis ke file

Berikut adalah kode yang saya gunakan untuk memilih string dari database. Pisahkan lalu tulis ke file teks.

#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

Output yang saya dapatkan di file adalah

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

Hasil yang diharapkan adalah

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

person xGen    schedule 15.12.2015    source sumber


Jawaban (1)


Anda memerlukan sepasang orang tua lagi di sekitar penetapan array

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

$() adalah evaluasi. arr=() adalah tugas majemuk. Split menggunakan spasi, jadi Anda bahkan bisa menggunakan spasi daripada baris baru untuk melakukan hal seperti ini

tr "-" " "

jika ksh Anda tidak mendukung penugasan gabungan, Anda dapat menggunakan set -A

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

person cms    schedule 15.12.2015
comment
ini berfungsi untuk saya -- versi ksh sh (Penelitian AT&T) 93u+ 01-08-2012 - alternatifnya adalah menggunakan set eksplisit - Saya memperbarui jawaban untuk menggambarkan hal ini - person cms; 15.12.2015
comment
mencoba ini untuk memeriksa verion [ echo "\c" | grep c ] && echo ksh93 || gema ksh88. Ini adalah ksh88. Tetap saja saya mendapatkan kesalahan yang sama - person xGen; 15.12.2015
comment
ya, Anda memerlukan 93 untuk =(). Saya memperbarui jawaban untuk menawarkan alternatif - person cms; 15.12.2015