【问题标题】:Split string in ksh在 ksh 中拆分字符串
【发布时间】:2018-06-28 10:35:08
【问题描述】:

我得到一个字符串如下:

foo=0j0h0min0s

不使用日期在几秒钟内转换它的最佳方法是什么?

我尝试了类似的方法,听起来不错,但没有运气:

#> IFS=: read -r j h min s <<<"$foo"
#> time_s=$((((j * 24 + h) * 60 + min) * 60 + s))
ksh: syntax error: `<' unexpected

欢迎任何想法,我无法使用 date -d 进行转换,因为它不存在于我正在处理的系统上。

【问题讨论】:

    标签: linux string shell split ksh


    【解决方案1】:

    &lt;&lt;&lt;"$foo" 主要是一种 bash 主义。它在一些/较新的 ksh 中受支持。 (谷歌'ksh here string')。

    您的阅读尝试在: 拆分,而您的输入中不存在该内容

    如果你先去掉字符,你可以在空白处分割(像往常一样) 并将 here-string 更改为 here-doc

    #!/bin/ksh
    
    foo=1j2h3min4s
    read -r j h min s << END
    "${foo//[a-z]/ }"
    END
    # or echo "${foo//[a-z]/ }" | read -r j h min s
    time_s=$((((j * 24 + h) * 60 + min) * 60 + s))
    echo ">$foo< = >${foo//[a-z]/ }< = $j|$h|$min|$s => >$time_s<"
    
    >1j2h3min4s< = >1 2 3   4 < = "1|2|3|4 " => >93784<
    
    # or using array, easy to assign, more typing where used
    typeset -a t=( ${foo//[a-z]/ } )
    time_s=$(( (( t[0] * 24 + t[1]) * 60 + t[2]) * 60 + t[3] ))
    echo ">$foo< = >${foo//[a-z]/ }< = ${t[0]}|${t[1]}|${t[2]}|${t[3]} => >$time_s<"
    

    【讨论】:

    • 不幸的是我无法让这段代码工作,它告诉我read: bad substitution((j * 24 + h) * 60 + min) * 60 + s: bad number
    • 您使用的是什么 ksh 版本?与 ksh (AT&amp;T Research) 93u+ 2012-08-01 一起为我工作。在我手头的 bash 中,如果我添加 echo "time_s=\$(((($j * 24 + $h) * 60 + $min) * 60 + $s))",我会看到额外的 qoutes。如果没有 here-doc 中的引号 ",它可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 2015-12-27
    • 2019-10-11
    • 1970-01-01
    • 2021-01-19
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多