【问题标题】:Format string on Linux and SolarisLinux 和 Solaris 上的格式字符串
【发布时间】:2016-08-09 19:25:28
【问题描述】:

我有一个 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 的方式格式化此日期字符串?

【问题讨论】:

  • 如果是 Korn Shell 而不是 Bash,为什么还要有 bash 标签?
  • 这令人困惑。

标签: solaris ksh


【解决方案1】:

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

来自the Linux Documentation ProjectAdvanced bash scripting guide 声明:

变量扩展/子串替换

这些结构是从 ksh 中采用的。

${var:pos}

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

${var:pos:len}

扩展为变量 var 的最大 len 个字符, 从偏移位置有关创意使用的示例,请参见示例 A-13 这个运算符的。

问题在于,在 Solaris 10 和更早版本上,/bin/ksh 提供了以前的 ksh 标准 ksh88,它没有实现此功能。

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

ksh93 的旧派生词在 Solaris 10 上可用。它被命名为dtksh,位于/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,因此您一开始就不会遇到这个问题。

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 您的第一句话略有错误,ksh 自 1993 年以来一直在实施此扩展。甚至有可能ksh 是第一个实施它的人,或者至少,可能有一些沟通在 Alan Cox 和 David Korn 之间,考虑到相同的语法在他们推出的同一年被两个 shell 采用。真正的问题是 /bin/ksh 在 Solaris 上是 ksh88
    • @jlliagre 当我用谷歌搜索“ksh 参数扩展”时,我没有在我找到的任何页面中看到它。我猜他们也都落伍了。
    • Linux 文档项目中的高级 bash 脚本指南指出,“变量扩展/子字符串替换”功能是从 ksh 借来的。 tldp.org/LDP/abs/html/parameter-substitution.html
    猜你喜欢
    • 2016-01-20
    • 1970-01-01
    • 2021-11-24
    • 2019-03-04
    • 2010-11-17
    • 1970-01-01
    • 2011-02-08
    • 2011-08-13
    • 2010-09-12
    相关资源
    最近更新 更多