【问题标题】:Shell script giving errors in ksh在 ksh 中给出错误的 Shell 脚本
【发布时间】:2016-06-26 08:11:35
【问题描述】:

我有一个在 Bash shell(使用 Red Hat Linux)中执行时运行良好的脚本,但是在使用 ksh 执行此脚本的 Solaris 10 (DB) 服务器上,这个相同的脚本会失败。该脚本基本上从文件中逐行读取并执行存储过程(在 Oracle 中)。下面是我的脚本:

#/bin/sh

for i in $(cat subscriber.txt); do

        SUBSCRIBER_ID="'$i'"
        sqlplus -s myuser/myuser  <<EOF
        execute delete_learnings($SUBSCRIBER_ID);
        commit;
        EXIT    
EOF
done

我得到的错误是:

./removeLearnings.sh: syntax error at line 3: `$' unexpected

知道可能出了什么问题吗?我应该将脚本更改为具有ksh 吗?我无法在这台机器上调试,因为它是客户环境(我无权访问)。

【问题讨论】:

  • Solaris /bin/sh 不符合 POSIX 标准,并且无法识别 $(…) 表示法 — 除非您有 Solaris 11。请注意,您没有使用 ksh; shebang 说#!/bin/sh 而不是#!/bin/ksh

标签: linux bash shell solaris ksh


【解决方案1】:

问题在于 $(...) 构造,它与 POSIX 兼容,但不受旧版 Bourne shell 的支持,/bin/sh 在 Solaris 10 及更早版本上运行。

您可以替换您的 shebang 来调用符合 Solaris POSIX 的 shell:

#!/usr/xpg4/bin/sh

或使用这种遗留语法(不太推荐):

for i in `cat subscriber.txt`; do

【讨论】:

  • 其中任何一个都可以正常工作吗?抱歉,我问的是基本问题,在 unix 中有点菜鸟 :)
  • 酷,我已经要求他们改变它。一旦成功,我会将您的答案标记为正确答案。谢谢!
【解决方案2】:

您正试图在 ksh (Korn shell) 上执行 sh(bourne shell) 脚本。尝试将 shebang (#!/bin/bash) 更改为 (#!/bin/ksh)

【讨论】:

    【解决方案3】:

    无论如何,用for 循环遍历文本文件是个坏主意。参见http://mywiki.wooledge.org/BashFAQ/001-,推荐的语法也更便携:

    while read stuff; do
        : things with "$stuff"
    done <subscriber.txt
    

    您通常会使用read -r,但我不知道这在 Solaris 上是否可用。

    但是,shell 循环通常是完全错误的方法。单个 SQL 调用要好得多,也更健壮:

    ( sed 's/.*/execute delete_learnings(&);/'
      printf "commit;\nEXIT\n" ) |
    sqlplus -s myuser/myuser
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多