我正在调试一个脚本,发现以下奇怪的行为。该脚本只是通过获取另一个文件来设置一些变量,然后这些变量的值用于运行主脚本命令。
第一个文件有以下行:
export PROJECT=ABCD1234
然后,脚本通过以下行获取该文件:
. file_path
在脚本的后面,脚本在以下语句中使用 $PROJECT 变量:
cd $PROJECT.proj #expecting to do string concatenation
这里的问题是 $PROJECT.proj 不会生成“ABCD1234.proj”,实际上它是进行字符串替换而不是字符串连接,所以 $PROJECT.proj 等于 .proj234!!
我怀疑第一个文件中可能有一些特殊的隐藏字符导致了这种行为,所以我使用 gvim 而不是 nedit 重写了该文件并且它起作用了。
有人知道这是怎么发生的吗?
每当您在 Windows 上创建文件,然后在类似 Unix/Linux 的环境中移动或使用它们时,请务必转换您的文件,以便它们在 unix/linux 上正常工作。
为此使用
dos2unix
实用程序,即
dos2unix file [file1 file2 file3 .... myFile*]
cmd 行中可以容纳尽可能多的文件。
消失的角色如
ABCD1234.proj
但是得到一些,但不是全部,比如
proj234
通常是 Windows 行结束符与 Unix/Linux 行结束符冲突的结果。 Windows 使用 ^M^J ( ),而 unix/linux 仅使用 ^J ( ).
或
Ctrl oct hex dec abbrev
^J 012 0a 10 nl
^M 015 od 13 cr
cr
=回车
想想旧的打字机,这是一个两步过程。
控制杆既可将压板移回左边距,又可将纸张推进,以便打印下一行。 CR 将回车返回到左边距,换行将打印到下一行。
Unix 假设有一个隐含的 CR 和一个 NL,所以有一个 CR 会让事情变得混乱,并使你的系统很容易覆盖数据(或者可能只是数据的显示,我现在没有时间测试)。
IHTH