我的代码没有打印某些变量,即使变量中有一个字符串,我也遇到了一些问题。
$ 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 +
我做错了什么,必须对打印缓冲区做些什么,还是有一个我没看到的更大的问题?
答案 0 :(得分:2)
您的输入文件是在Windows下创建的,因此使用CRLF行终止。这会导致bash下linux下的输出相对于预期的@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