Linux和Solaris上的格式字符串

时间:2016-08-09 19:25:28

标签: solaris ksh

我有一个Korn Shell脚本,其中一部分是它采用YYYYMMDD格式的给定日期并以YYYY / MM / DD格式输出。起初我试过

typeset displaystart=`date --date="${gbegdate}" '+%Y/%m/%d'`

在Linux上运行正常,但Solaris date没有--date选项。然后我尝试了

typeset displaystart=`echo ${gbegdate:0:4}`/`echo ${gbegdate:4:2}`/`echo ${gbegdate:6:2}`

也适用于Linux,但在Solaris上它只输出//

如何以适用于Linux和Solaris的方式格式化此日期字符串?

2 个答案:

答案 0 :(得分:2)

POSIX shell语法的${variable:start:length}扩展是在1993年发布的ksh版本中引入的,精确命名为ksh93,并且也在bash 1.13中引入了年。

来自Advanced bash scripting guide州的the Linux Documentation Project

  

可变扩展/子串替换

     

这些结构已从ksh采用。

     

<强> $ {VAR:POS}

     

变量var展开,从偏移位置开始。

     

<强> $ {VAR:POS:LEN}

     

扩展到变量var的最大len个字符,   来自偏移位置。有关广告素材使用的示例,请参阅示例A-13   这个运营商。

问题是,在Solaris 10及更早版本中,/bin/ksh提供了之前的ksh标准ksh88,但未实现此功能。

另一方面,在Linux上,ksh通常是ksh93,它支持子字符串提取。这就解释了为什么你的脚本在Linux ksh下工作(如果你真的在ksh上测试过它。)

虽然Solaris 10上提供了ksh93的旧衍生产品。它名为dtksh ans,位于/usr/dt/bin/dtksh。您的命令应该随之改变,但是我不建议完全切换到dtksh,这个shell将从Solaris中逐步淘汰,但您仍然可以从常规ksh脚本中使用它来解决您的问题。问题:

typeset displaystart=$(/usr/dt/bin/dtksh -c "gbedate=$gbedate; echo \${gbegdate:0:4}/\${gbegdate:4:2}/\${gbegdate:6:2}")

请注意,Solaris 11及更高版本同时提供GNU dateksh93,因此您首先不会遇到该问题。

答案 1 :(得分:0)

Korn shell没有${variable:start:length}语法;这是POSIX shell语法的bash扩展。

您可以改为使用echo "$variable" | cut -cstart-end

typeset displaystart=`echo $gbegdate | cut -c1-4`/`echo $gbegdate | cut -c5-6`/`echo $gbegdate | cut -c7-8`

或许您可以将脚本更改为使用bash而不是ksh