【问题标题】:Errors on beginner bash script初学者 bash 脚本上的错误
【发布时间】:2010-10-12 10:52:03
【问题描述】:

你能帮帮我吗? 我在 cygwin 上将其作为 ./test.sh 运行,但在第 51 行出现意外的文件结尾。 有什么想法吗?

提前谢谢

最后编辑:最终版本'在 CygWin 上运行,问题在于换行符,CrLf 而不是 Lf。

#!/bin/sh
##################################################
## USAGE
##################################################
if [ $# -ne 1 ]; then
    echo "1>Use Extractor: $0 <MODO DE OPERACAO>"
    echo "2>Use Extractor: $0 <MODO DE OPERACAO> <DATA INICIAL> <DATA FINAL>"
    exit 127
else
    if [ $1 -lt 0 ]; then
        if [ $1 -gt 1 ]; then
            echo "2>Use Extractor: $0 <MODO DE OPERACAO> <DATA INICIAL> <DATA FINAL>"
            exit 127
        fi
    fi
fi
##################################################
## VARS
##################################################

    ##########################################
    ## AUX
    ##########################################
    set java_cmd=""
    set java_cmd_emergencial=""
    set java_cp=""

    ##########################################
    ## JAR
    ##########################################
    set db_user=""
    set db_pwd=""
    set conn_string=""
    set work_dir=""
    set output_dir=""


##################################################
## PARAMETROS
##################################################
set mode=$1
set data_ini=""
set data_fim=""
if [ $# -eq 3 ]; then
    set data_ini    = $2
    set data_fim    = $3
fi

##################################################
## CHAMADA DO JAR
##################################################
java  "$java_cp" "$java_cmd" "$mode" "$db_user" "$db_pwd" "$conn_string" "$work_dir" "$output_dir"

【问题讨论】:

  • 代码没有很好的缩进.. 缩进它并指向第 51 行
  • 那么问题是找到行号然后找到错误?
  • Emilio:它相当​​缩进,第 51 行是文件的最后一行 tho :/ Learnin: 问题是是否有错误,因为我没有完全访问 linux 服务器的权限为了测试它,我在 cygwin 上测试,也许这就是错误。
  • 请参阅下面的帖子,变量设置中的间距可能会导致问题。还修复了 if,它是 gt 而不是 -gt。
  • 全部解决,谢谢大家的提示,问题是windows编辑器保存为windows格式(CrLf)而不是Unix(Lf)。感谢所有提示,掩盖了让我寻找文件格式的答案。

标签: linux bash cygwin


【解决方案1】:

"set" 不是 bash 语法。而不是“set foo = bar”,而是“foo=bar”。

注意:出于某种原因,我写了没有空格的更正表格。它必须这样写。您更新的问题仍然是错误的。

【讨论】:

  • 注意 '=' 周围不能有空格,所以 'foo = bar' 是错误的。
  • @Neil,这就是我这样写的原因。
【解决方案2】:

您可能希望在最后一行引用必填字段。现在它将是一个空白而不是“”。

例如

java  "$java_cp" "$java_cmd" "$mode" "$db_user" "$db_pwd" "$conn_string" "$work_dir" "$output_dir"

编辑为至少在我的系统上运行 java:

#################################################
#!/bin/sh
##################################################
## USAGE
##################################################
if [ $# -ne 1 ]; then
    echo "1>Use Extractor: $0 <MODO DE OPERACAO>;"
    echo "2>Use Extractor: $0 <MODO DE OPERACAO> <DATA INICIAL> <DATA FINAL>"
    exit 127
else
    if [ $1 -lt 0 -o $1 -gt 1 ]; then
        echo "1>O Parametro <MODO DE OPERACAO> deve ser 0 (Cartorios) ou 1 (Transacoes);"
        exit 127
    fi
fi
##################################################
## VARS
##################################################

    ##########################################
    ## AUX
    ##########################################
    java_cmd=""
    java_cmd_emergencial=""
    java_cp=""

    ##########################################
    ## JAR
    ##########################################
    db_user=""
    db_pwd=""
    conn_string=""
    work_dir=""
    output_dir=""


##################################################
## PARAMETROS
##################################################
mode=$1
data_ini=""
data_fim=""
if [ $# -eq 3 ]; then
    data_ini=$2
    data_fim=$3
fi

##################################################
## CHAMADA DO JAR
##################################################
java  $java_cp $java_cmd $mode $db_user $db_pwd $conn_string $work_dir $output_dir

【讨论】:

  • 没有必要,一旦脚本正常,vars 将始终被填充,感谢提示
【解决方案3】:

如果没有其他问题,请仔细检查脚本最后一行的末尾是否有换行符。

【讨论】:

  • 我做的第一件事,在那之前我只用 if-else-fi 添加了一个测试脚本,给了我同样的错误,我开始认为错误是在 cygwin
  • 虽然你的答案不是关于代码本身,但帮助我找到了错误,问题是编辑器没有保存 unix 格式(lf 而不是 crlf)现在它已经全部解决了。跨度>
  • 根据我的经验,CR/LF 错误通常很难找到。这不是你首先想到的。
  • 脚本上的小改动之外的错误确实很微妙。
  • 使用可让您打开查看 EoL 字符(如 SciTE)的编辑器,使检查变得微不足道。 :)
【解决方案4】:

在 MacOS X 10.5.6 上为我运行没有错误,除了这一行:

if [ $1 -lt 0 -o gt 1 ];

应该是

if [ $1 -lt 0 -o $1 -gt 1 ];

我不评论脚本的其余部分是否真的做了它应该做的......

【讨论】:

  • 谢谢,忘了第二个参数比较,还是一样的错误:/
  • 什么版本的 bash?通过上述修复,我在 Fedora Code 10 上使用 Bash 版本 3.2.39(1)-release 的单个参数调用没有错误。
  • GNU Bash,版本 3.2.48(21)-release (i686-pc-cygwin)
猜你喜欢
  • 1970-01-01
  • 2022-11-14
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
相关资源
最近更新 更多