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