Echo不打印某些变量

时间:2014-04-23 18:16:26

标签: linux bash

我的代码没有打印某些变量,即使变量中有一个字符串,我也遇到了一些问题。

$ dmisysname=$(sed -ne 148p ./3A47083/S09850724414683/002590F3851A.txt | awk -F '=' '{ print $2 }' | sed 's/ //')
$ dmibrdname=$(sed -ne 157p ./3A47083/S09850724414683/002590F3851A.txt | awk -F '=' '{ print $2 }' | sed 's/ //')
$ echo $dmisysname $dmibrdname

这应该给我$ dmisysname和$ dmibrdname里面的任何东西,但输出显示:

  

X9DRi-LN4 + / X9DR3-LN4 +

为了确保2个变量中包含一个字符串,我将单独回显每个变量。

$ echo $dmisysname
  

PIO-647R-6RLN4F + -ST031

$ echo $dmibrdname
  

X9DRi-LN4 + / X9DR3-LN4 +

我做错了什么,必须对打印缓冲区做些什么,还是有一个我没看到的更大的问题?

2 个答案:

答案 0 :(得分:2)

您的输入文件是在Windows下创建的,因此使用CRLF行终止。这会导致下的输出相对于预期的@Lurker's useful explanation混淆。

使用dos2unix工具修复您的文件:

$ dmisysname=$(sed -ne 148p ./3A47083/S09850724414683/002590F3851A.txt | awk -F '=' '{ print $2 }' | sed 's/ //')
$ dmibrdname=$(sed -ne 157p ./3A47083/S09850724414683/002590F3851A.txt | awk -F '=' '{ print $2 }' | sed 's/ //')
$ echo $dmisysname $dmibrdname
 X9DRi-LN4+/X9DR3-LN4+
$ dos2unix 3A47083/S09850724414683/002590F3851A.txtdos2unix: converting file 3A47083/S09850724414683/002590F3851A.txt to Unix format ...
$ dmisysname=$(sed -ne 148p ./3A47083/S09850724414683/002590F3851A.txt | awk -F '=' '{ print $2 }' | sed 's/ //')
$ dmibrdname=$(sed -ne 157p ./3A47083/S09850724414683/002590F3851A.txt | awk -F '=' '{ print $2 }' | sed 's/ //')
$ echo $dmisysname $dmibrdname
PIO-647R-6RLN4F+-ST031 X9DRi-LN4+/X9DR3-LN4+
$ 

我在Linux下重新创建了一个可行的文件版本,然后使用unix2dos按照窗口格式化它。然后我能够重现你的问题。使用dos2unix将其恢复为可以修复它。

答案 1 :(得分:2)

每个变量都以回车符(\r)结束。所以会发生什么是回声,但第二个覆盖了第一个。

我将用-e选项说明:

$ echo -e "FOO\rBAR\r"
BAR

但两者都在呼应。只是BAR覆盖FOO

$ echo -e "FOO\rBAR\r" | od -c
0000000   F   O   O  \r   B   A   R  \r  \n
0000011