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 "-" " "

หาก 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 || เอคโค ksh88 มันคือ ksh88 ฉันยังคงได้รับข้อผิดพลาดเดียวกัน - person xGen; 15.12.2015
comment
ใช่ คุณต้องมี 93 สำหรับ =() ฉันอัปเดตคำตอบเพื่อเสนอทางเลือกอื่น - person cms; 15.12.2015