bash - echo 命令在 shell 脚本中运行时无法正确打印花括号
问题描述
我正在编写一个读取 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
但是,如果我尝试在终端上从上述脚本运行相同的 echo 行,我会得到带有大括号的正确输出:
{"name": "subhash","age":23,"salary":1000}
上面的脚本有什么问题?
解决方案
问题是您的 test1.csv 包含“windows”\r\n
行返回。
\r
被读取为最后一个变量的一部分,然后在左大括号上打印以下字符 ( ) }
- echo 正在完成它的工作。
我不确定为什么以交互方式执行此操作对您有用(您是否以相同的方式读取变量?)但您只需要清理输入文件,或者使用例如从最后一个变量的末尾删除它${salary%$'\r'}
(作为旁注,您无需退出报价即可打印转义的报价,因此您的回声可能如下所示:
echo "{\"name\":\"${name}\",\"age\":${age},\"salary\":${salary%$'\r'}}"
)
推荐阅读
- javascript - 如何 $watch 来自 ng-repeat 复选框的更改
- c++ - (核心转储)c ++中的链接列表
- sql - 如何将excel表中的数据更新到基于SQL的数据库中?
- sql - Postgresql 每日插入
- c - 如何从 C/C++ 中的当前语言环境获取短日期格式字符串?
- excel - How to use column of strings to find that same string in another sheet, and paste a corresponding value from sheet 1 next to the found value?
- javascript - 如何在 WebStorm 中使用 jsconfig 路径?
- azure-devops - 递增版本号 android 或 iOS 类库 azure devops
- laravel - 如何在 laravel 中处理 InvalidSignatureException 异常并返回自定义错误 json 响应
- spring-data-rest - 向所有 Spring Data Rest 控制器添加方法