linux - ksh "."运算符正在执行字符串替换而不是连接

标签 linux scripting ksh

我在调试脚本时发现了以下奇怪的行为。该脚本只是通过获取另一个文件来设置一些变量,然后这些变量的值用于运行主脚本命令。

第一个文件有以下行:

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/

相关文章:

linux - 从变量 unix 中提取值

linux - 重定向 stdin 会引发不明确的重定向错误

shell - 如何使用 SED 替换 [] 括号

ksh - 为什么 ksh 脚本在 while 循环后退出代码为 1?

linux - 使用 tac 和 sed 反转文件

bash - 从 shell 脚本中的后台函数中获取 PID

java - 如何在 Java 中使用 sudo 权限执行 bash 命令?

python - 通过 python 子进程启动 linux 命令不能按预期工作

linux - 正则表达式 - Grep 特定的 NTP IP 地址

linux - 如何递归grep并忽略子目录的子目录?