shell:意外标记'fi'附近的语法错误

时间:2015-03-24 06:19:22

标签: shell scripting

在意外令牌附近获取语法错误`fi'执行下面的代码。 以下是输出: -

: command not founde 2: 
: command not founde 7: 
run_billing.sh: line 22: syntax error near unexpected token `fi'
'un_billing.sh: line 22: `fi

脚本是:

#!/bin/sh

#
# main
#
NARGS=$#

if [ $NARGS -lt 2 ]
then
        echo "$PRG_NAME: error: incorrect number of arguments ($NARGS)";
        echo "Usage: $PRG_NAME [Time]";
    echo "Time format - pin_virtual_time format. e.g:- 062000002015.00";
    echo "Example: sh run_billing.sh 062000002015.00";
        exit 1
fi

if [ $NARGS -eq 2 ]
then
        echo "Run Billing script - pin_bill_day";
        pin_virtual_time -m2 $1;
        pin_bill_day;
fi

1 个答案:

答案 0 :(得分:1)

您的线路末端被拧紧,每条线路由CR / LF终止,而不仅仅是LF。

如果您执行od -c run_billing.sh之类的操作,则根据我的测试脚本(\r字符为CR),您会在其中看到^M个字符:

if [[ 1 -eq 1 ]]^M
then^M
    echo x is 1^M
fi^M
^M

0000000   i   f       [   [       1       -   e   q       1       ]   ]
0000020  \r  \n   t   h   e   n  \r  \n  \t   e   c   h   o       x
0000040   i   s       1  \r  \n   f   i  \r  \n  \r  \n
0000054

并且,当该文件运行时,我们会看到类似的问题。

这就是为什么你得到奇怪的错误输出,因为CR在继续消息之前将光标移动到行的开头,覆盖它已经输出的一些内容。

例如,脚本的第2行和第7行(所谓的空白行)包含一个CR字符,该字符被解释为不存在的命令。因此,对于第2行,您会看到(叠加):

run_billing.sh: line 2:<CR>
: command not found
=========================== giving:
: command not founde 2:

正是你所看到的。

您需要修改文件以删除这些CR字符,this excellent answer中提供了几种方法。