【问题标题】:Ksh syntax error '=~'Ksh 语法错误'=~'
【发布时间】:2015-02-18 05:19:37
【问题描述】:
read -p "The Process running for "$days" days continuously OK to kill this     process (y/N)? " -u 4 ok
     [[ "${ok}" =~ y ]] || continue
        echo "Killing $pid"
      kill -HUP "$pid"
        fi 

这是我的脚本的 sn-p,当我执行它时它显示为

 `=~' is not expected.

如何解决?

【问题讨论】:

  • 您正在删除 $days 的引号,可能不应该这样。什么版本的 ksh?
  • ksh 版本我不知道。但它来自 /usr/bin/ksh
  • ksh --version 说什么?
  • ksh的版本是ksh93
  • 这是一个ksh 脚本吗?那里的-p 选项看起来像bash read -p 选项而不是ksh read -p 选项(因为ksh 声称是用于从手册中读取的衍生过程,我可以看到)。 =~ 也应该在手册中的 ksh93 中工作,所以我不确定发生了什么。

标签: bash shell ksh


【解决方案1】:

我猜你的 shebang 行有 #!/bin/sh,所以你无法访问完整的 ksh 语法。如果你这样做了,ksh93 似乎确实支持 [[ string =~ regex ]] 语法,所以这里有些东西加起来不正确。

无论哪种方式,有一个构造在经典 Bourne shell 中同样有效,您可以使用它来代替,另外还有一个好处是您的脚本将与 ksh 不可用的系统兼容。

您使用read -p <prompt>,但那是 Bashism; -p 选项与 read 的含义在 ksh93 中完全不同。

printf 'Process ran for %i days continuously, OK to kill this? ' "$days"
read -u 4 ok
case $ok in [Yy]* ) ;; *) continue ;; esac
echo "Killing $pid"
kill -HUP "$pid"

您的代码在输入中的任意位置查找 y,但我将其限制为仅检查第一个字符。

(您的代码有不稳定的缩进和未配对的fi,我省略了。)

【讨论】:

  • +1 @EtanReisner 观察到 read -p 是 Bashism。通过将提示拆分为单独的echo 来解决这个问题应该很容易。
  • 我这样用过。但它没有等待我的Y,它显示如下进程连续运行11天可以杀死进程(y/n)? checkdisk.sh[61]:读取:0403-039 管道没有查询过程。
  • -u 4 表示您已在未向我们显示的代码中设置了从文件描述符 4 读取的内容;如果你没有,那就错了。
  • 我像 exec 4
  • 错误信息是因为read -pksh中有不同的含义,即从管道中读取。所以你需要改变它。
【解决方案2】:

你的?是'如何解决' - Tripleee 的建议看起来像一个解决方案 - 简化代码 - 尝试:

if [[ "${ok} == "y" ]] 

我尝试复制您的代码 sn-p 并得到一个不同的错误。 D&C 的时间 - 简单的 ksh93 脚本测试 '=~'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2014-04-05
    相关资源
    最近更新 更多