ksh“。”运算符正在执行字符串替换而不是连接

问题描述 投票:0回答:1

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

第一个文件有以下行:

export PROJECT=ABCD1234

然后,脚本通过以下行获取该文件:

. file_path

在脚本的后面,脚本在以下语句中使用 $PROJECT 变量:

cd $PROJECT.proj #expecting to do string concatenation

这里的问题是 $PROJECT.proj 不会生成“ABCD1234.proj”,实际上它是进行字符串替换而不是字符串连接,所以 $PROJECT.proj 等于 .proj234!!

我怀疑第一个文件中可能有一些特殊的隐藏字符导致了这种行为,所以我使用 gvim 而不是 nedit 重写了该文件并且它起作用了。

有人知道这是怎么发生的吗?

linux scripting ksh
1个回答
2
投票

每当您在 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

© www.soinside.com 2019 - 2024. All rights reserved.