Bash 脚本源配置文件但不能在算术中使用变量

Bash script sourcing config file but can't use vars in arithmetic

这简直要了我的命。我有一个配置文件 "myconfig.cfg",内容如下:

SOME_VAR=2
echo "I LOVE THIS"

然后我有一个我正在尝试 运行 的脚本,它获取配置文件以便将其中的设置用作变量。我可以很好地打印它们,但是当我尝试将它们放入一个数字变量中以用于 "seq " 命令之类的东西时,我得到了这个奇怪的 "invalid arithmetic operator" 错误。 这是脚本:

#!/bin/bash

source ./myconfig.cfg
echo "SOME_VAR=${SOME_VAR}"
let someVarNum=${SOME_VAR}
echo "someVarNum=${someVarNum}"

这是输出:

I LOVE THIS
SOME_VAR=2
")syntax error: invalid arithmetic operator (error token is "
someVarNum=

我已经尝试了无数理论上不应该产生影响的事情,而且,令人惊讶的是,它们没有。我简直想不通。如果我只是将行 "SOME_VAR=2" 直接放入脚本中,一切都很好。我猜我必须逐行读取配置文件,用“=”拆分字符串,然后找到并创建我想手动使用的变量。

该错误与@TomFenech 的评论中指出的完全一致。 myconfig.cfg 中的第一行(也可能是所有行)以 Windows CR-LF 行结束。 Bash 认为 CR 是一个普通字符(不是空格),所以它会将 SOME_VAR 设置为两个字符串 2CR。 (CR 是十六进制代码为 0x0D 的字符。如果用十六进制转储程序显示文件,您会看到:hd myconfig.cfg。)

let 命令对数字进行算术运算。它还认为 CR 是一个普通字符,但它既不是数字也不是运算符,因此它会抱怨。不幸的是,它没有尝试清理错误消息中字符的显示,因此回车 return 显示在两个 " 符号之间。因此,错误消息的结尾会覆盖开头。

不要使用 Windows 文本编辑器创建 Unix 文件。或者在将它们复制到 Unix 机器后,使用像 dos2unix 这样的实用程序来修复它们。