【问题标题】:Bash echo weird behavior [duplicate]Bash回声奇怪的行为[重复]
【发布时间】:2019-03-19 01:48:36
【问题描述】:

我写了一个脚本来把 .CSV 改成 json。

#!/bin/bash

exec 0< example.csv

while IFS=, read name element input decrease
do
   echo "${element}decrease: ${decrease}test"
done

我在此处粘贴的 example.csv

name1,A,11,12
name2,B,13,14

但是输出真的很奇怪……

testrease: 12
testrease: 14

如您所见,test 重写 AdecreaseBdecrease,使它们成为 testrease

我不敢相信!!所以我尝试不使用exec 0&lt; example.csv,在标准输入中输入它们,这次我得到了我想要的

name1,A,11,12
Adecrease: 12test

所以我想也许 example.csv 中有一些字符我看不出是什么导致了这个问题。我用cat -v example.csv

name1,A,11,12^M
name2,B,13,14^M

没什么奇怪的,我就卡在这里了。

我对shell脚本很陌生,所以如果有人能给我一些建议,我会非常激动!!

【问题讨论】:

  • `^M`看起来不奇怪?
  • 这是tag wiki 在发布问题之前要求您检查的第一件事。
  • 谢谢你们,伙计们!好像我犯了一个愚蠢的错误....当我使用 vim 并设置 invlist 时,它并没有让我感到恶心 '^M'。
  • 在 vim 中,您可以运行 :set fileformat=unix 以使您的文件在下次保存时使用 UNIX 换行符写入。大概它被自动检测为fileformat=dos,所以 vim 将 CR 视为正常(对于 DOS 文本文件,而不是 UNIX 文件),因此当您启用显示不可见字符时它们不会显示。

标签: linux bash shell newline carriage-return


【解决方案1】:

谢谢你,@chepnertag wiki 在这个愚蠢的问题上为我节省了一个小时。

这是来自 wiki 的解决方案:

检查您的脚本或数据是否有 DOS 样式的行尾字符。

  • 使用cat -v yourfileecho "$yourvariable" | cat -v

    DOS 回车将在每一行之后显示为^M

    如果您找到它们,请使用dos2unix(又名fromdos)或tr -d '\r' 删除它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2015-07-26
    • 2020-04-26
    • 2015-08-17
    • 1970-01-01
    相关资源
    最近更新 更多