Shell脚本在ksh中给出错误

时间:2016-03-11 07:06:00

标签: linux bash shell solaris ksh

我有一个在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吗?我无法在这台机器上进行调试,因为它是一个客户环境(我无法访问)。

3 个答案:

答案 0 :(得分:6)

问题是$(...)构造符合POSIX但不受旧版Bourne shell支持,/bin/sh在Solaris 10及更早版本上。

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

#!/usr/xpg4/bin/sh

或使用此旧版语法(少推荐):

for i in `cat subscriber.txt`; do

答案 1 :(得分:0)

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

答案 2 :(得分:0)

无论如何,使用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