我试图同时调用korn shell和shell脚本。在一个ksh。我的ksh脚本如下:
#!/bin/sh
. /u01/EPM/hyp_app/scripts/maxl/Start_Stop/Stop_All.ksh
. /app/Oracle/Middleware/user_projects/epmsystem1/bin/stop.sh
这将成功运行.sh,但将无法运行.ksh,并返回此错误
/u01/EPM/hyp_app/scripts/maxl/Start_Stop/Stop_All.ksh: line 33: syntax error near unexpected token `;'
/u01/EPM/hyp_app/scripts/maxl/Start_Stop/Stop_All.ksh: line 33: `if [ $f1 != ' ' ]; then;'
但是当单独运行Stop_All.ksh时,它可以正常工作而没有任何问题。
为什么从其他地方运行时会出现语法错误,但直接运行时不会出现语法错误?请注意,此较大ksh的位置与Stop_All.ksh位于同一位置。所以它不是相对目录问题(我不认为)。
编辑:
部分问题是Stop_All.ksh中的文本文件在作为更大脚本的一部分运行时没有被创建(但是当我单独运行它时创建它没有问题。)
#Clears database log
echo ' ' > /u01/EPM/hyp_app/logs/Start_Stop/DatabaseList.log
# run filter export process
$ESS_ENV_DIR/startMaxl.sh $SCRIPT_DIR/maxl/Start_Stop/SpoolDatabase.mxl
echo ' ' > /u01/EPM/hyp_app/export/Start_Stop/Application_List.txt
# Parses it out in do 8 for start and stop, and insert | pipe
sed -i -e 's/./&|/21' -i -e 's/./&|/30' -i -e 's/./&|/40' /u01/EPM/hyp_app/logs/Start_Stop/DatabaseList.log;
cat /u01/EPM/hyp_app/logs/Start_Stop/DatabaseList.log | grep 'TRUE' > /u01/EPM/hyp_app/export/Start_Stop/GrepApplication_List.txt
while IFS='|' read -r f1 f2 f3 f4 #f5
do echo $f1 $f2 >> /u01/EPM/hyp_app/export/Start_Stop/Application_List.txt
echo $f3 >> /u01/EPM/hyp_app/export/Start_Stop/Application_List.txt
# finishes do while and the points the input file that the IFS reads through (PUT DATABSE TXT FILE HERE)
done < /u01/EPM/hyp_app/export/Start_Stop/GrepApplication_List.txt;
while IFS=' ' read -r f1 f2 f3 f4 #f5
do
if [ $f1 != ' ' ]; then;
$ESS_ENV_DIR/startMaxl.sh $SCRIPT_DIR/maxl/Start_Stop/Master_Stop.mxl $f1 $f2
fi
答案 0 :(得分:1)
当您测试if [ $f1 != ' ' ];
时,您期望f1
可以是一个空格。假设f1
填充了空格。第if [ != ' ' ];
行是错误的
我认为当你自己运行Stop_All.ksh时,f1
充满了除空格之外的东西。
将您的代码更改为
if [ "$f1" != ' ' ];
或习惯使用花括号
的语法if [ "${f1}" != ' ' ];
答案 1 :(得分:0)
感谢用户Nick Burns,
我必须将顶部更改为#!/ bin / ksh