2017-09-15 61 views
0

我得到这个程序非常奇怪的输出。什么是“回车”行为,以及如何将其删除 - 最终缺少单引号?为什么字母“T”缺失?如何编写代码来纠正这个问题?删除变量的回车末端

代码我使用

#!/bin/bash 

export DATABASE_LIST="/opt/halogen/crontab/etc/db_stat_list.cfg" 
export v3="" 

while read -r USERID ORACLE_SID2 
do 
v3="This is '${ORACLE_SID2}' " 
echo $v3 
done < <(tac $DATABASE_LIST) 

输出

'his is 'OT1SL80 
'his is 'OT1SL010 

我从阅读的文件不是腐败,是一个小两行

[[email protected] test2]$ cat /opt/halogen/crontab/etc/db_stat_list.cfg 
asp_dba/dba OT1SL010 
asp_dba/dba OT1SL80 

谢谢

+1

你有'这是'OT1SL80 '......这意味着'''覆盖'T'。您需要删除CR _before_变量替换发生。我建议用管道连接到'tr -d'\ r''。 – Siguza

回答

1

Yo你的DATABASE_LIST文件是DOS/Windows格式,在每行的末尾有回车+换行符。 Unix只使用换行符作为行终止符,所以unix工具将回车视为行内容的一部分。您可以从被告诉read命令对待回车为空白(如空格,制表符等)问题保持这个,因为read自动线的开头和结尾删除空格:

... 
while IFS="$IFS"$'\r' read -r USERID ORACLE_SID2 
    ... 

注由于对IFS(基本上列出空白字符)的分配是read命令的前缀,因此它仅适用于该命令,并且不必在之后恢复正常。

+0

谢谢戈登,我花了几个小时没有想到它是一个DOS/Windows问题,虽然我以前有过这个问题。也感谢代码。它正在工作。我删除了文件并正确地重新创建了它 – aymanzone