在shell脚本中运行时,echo命令不能正确打印花括号

时间:2018-09-18 06:55:05

标签: bash shell unix ksh

我正在编写一个读取csv文件并打印读取值的shell脚本:

#!/bin/bash     
#echo"Starting execution in script"     
exec < src/main/resources/test1.csv || exit 1      
read header # read (and ignore) the first line      
while IFS=, read name age salary ; do  
  echo  "{"\"name"\":"\"${name}"\","\"age"\":${age},"\"salary"\":${salary}}"     
done   

test1.csv(输入文件):

name,age,salary   
Subhash,26.0,10000.0   
Amit,25.0,20000.0   
Rohit,28.0,3000.0   
Manoranjan,20.0,50000.0

在运行脚本时,我通过以下方式获取输出:

}"name":"Subhash","age":26.0,"salary":10000.0   
}"name":"Amit","age":25.0,"salary":20000.0   
}"name":"Rohit","age":28.0,"salary":3000.0   
}"name":"Manoranjan","age":20.0,"salary":50000.0 

但是,如果我尝试在终端上从上述脚本运行相同的回显行,则使用括号将得到正确的输出:

{"name": "subhash","age":23,"salary":1000}   

上面的脚本怎么了?

2 个答案:

答案 0 :(得分:3)

问题是您的test1.csv包含“ windows” \r\n行返回。

\r读取为最后一个变量的一部分,然后在后大括号上打印以下字符(})-echo正在完成其工作。

我不确定为什么交互式地执行此操作(您是否以相同的方式读取变量?),但是您只需要清理输入文件,或者使用例如,从最后一个变量的末尾删除它。 ${salary%$'\r'}

(作为一个补充说明,您无需退出报价单即可打印转义的报价单,因此您的回显可能如下所示:

echo "{\"name\":\"${name}\",\"age\":${age},\"salary\":${salary%$'\r'}}"

答案 1 :(得分:2)

我稍微修改了你的剧本;删除了execread header。相反,我选择了sed来切断标题行,而选择了akw来删除尾随空格(来自test1.csv文件)。这项工作对我来说很好:

while IFS=, read name age salary; do
  echo  "{"\"name"\":"\"${name}"\","\"age"\":${age},"\"salary"\":${salary}}"
done < <(sed 1d src/main/resources/test1.csv | awk '{$1=$1};1')