我在调试脚本时发现了以下奇怪的行为。该脚本只是通过获取另一个文件来设置一些变量,然后这些变量的值用于运行主脚本命令。
第一个文件有以下行:
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 (\r\n),而 unix/linux 仅使用 ^J (\n)。
或
Ctrl oct hex dec abbrev
^J 012 0a 10 nl
^M 015 od 13 cr
cr
= 回车
想想旧式打字机,这是一个两步过程。
控制杆既将压板移回左边距,又使纸张前进,以便打下一行。 CR 将回车返回到左边距,将换行推进到下一行打印。
Unix 假设有一个隐含的 CR 和一个 NL,所以有一个 CR 会混淆事情并使你的系统很容易覆盖数据(或者可能只是数据的显示,我现在没有时间测试).
健康教育
关于linux - ksh "."运算符正在执行字符串替换而不是连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22490650/