-1

环境:KornShell (ksh)

我想分隔下面的字符串:

-ssRMDFXXRT -rtETL -ltDAILY -sD20120203 -lfRS -UP"EffTimeStamp=20110203-210000#InputCtxNm=Forigen Exchange Today#RunType=EOD" -QqDESKTOP -Ln9999 -XmXMLBLOCK

并且输出应该是(-UP 之后的字符串应该保留为一个标记):

-ssRMDFXXRT 
-rtETL 
-ltDAILY 
-sD20120203 
-lfRS 
-UP"EffTimeStamp=20110203-210000#InputCtxNm=Forigen Exchange Today#RunType=EOD" 
-QqDESKTOP 
-Ln9999 
-XmXMLBLOCK

我尝试了很多但无法获得预期的输出,但现在我想我需要一些帮助。请帮忙。

4

3 回答 3

1
for arg in "$@"; do printf '<%s>\n' "$arg"; done

这会迭代所有参数,并且不会在空格处破坏参数。

于 2012-05-08T11:14:58.303 回答
0

您必须使用 eval 让 shell 尊重引用的参数

$ str='-ssRMDFXXRT -rtETL -ltDAILY -sD20120203 -lfRS -UP"EffTimeStamp=20110203-210000#InputCtxNm=Forigen Exchange Today#RunType=EOD" -QqDESKTOP -Ln9999 -XmXMLBLOCK'
$ arr=($str); echo ${#arr[@]}
11
$ arr=("$str"); echo ${#arr[@]}
1
$ eval arr=($str); echo ${#arr[@]}
9

然后按行显示:printf "%s\n" "${arr[@]}"
您会注意到双引号已从“复杂”参数中消失。

但是,你的初始字符串"$*"不对?如果是,请"$@"改用。

于 2012-05-08T14:00:34.227 回答
0
krithika.542> echo "-ssRMDFXXRT -rtETL -ltDAILY -sD20120203 -lfRS -UP"EffTimeStamp=20110203-210000#InputCtxNm=Forigen Exchange Today#RunType=EOD" -QqDESKTOP -Ln9999 -XmXMLBLOCK" | perl -pe 's/ /\n/g'
-ssRMDFXXRT
-rtETL
-ltDAILY
-sD20120203
-lfRS
-UPEffTimeStamp=20110203-210000#InputCtxNm=Forigen
Exchange
Today#RunType=EOD
-QqDESKTOP
-Ln9999
-XmXMLBLOCK
krithika[ncm_o12.0_int.cctcsvibh].543> 
于 2012-05-08T12:53:30.213 回答