为什么空格会像换行符一样回显?

为什么空格会像换行符一样回显?

我得到的 JSON 数据如下所示:

[
  {
    "loginId": "7638749",
    "customerprofileDetails": {
      "securityQuestions": [
        "What is your favorite sports team?",
        "What is your favorite song?",
        "Who is your favorite artist?"
      ]
    }
  }
]

我有一个脚本,我在其中传递该文件作为第一个参数。该脚本如下所示:

for json in `cat $PWD/$1 | jq -cr '.[]'` ; do
    echo "$json"
done

由于某种原因,当我运行此脚本时,它会输出以下内容:

> fileFromJson.sh tmp2.json
{"loginId":"7638749","customerprofileDetails":{"securityQuestions":["What
is
your
favorite
sports
team?","What
is
your
favorite
song?","Who
is
your
favorite
artist?"]}}

为什么会有这些换行符以及导致此问题的原因是什么?当我刚运行时cat $PWD/tmp2.json | jq -cr '.[]',它会打印出一行。如果这很重要的话,我正在使用 MacOS。

答案1

不带引号的命令替换`cat $PWD/$1 | jq -cr '.[]'`执行以下操作:

  1. 运行命令cat $PWD/$1 | jq -cr '.[]'。顺便说一句,这是一种过于复杂的书写方式jq -cr '.[]' <"$1",只不过这个变体不会破坏if$1包含某些特殊字符或者是绝对路径。
  2. 将生成的字符串分成以空格分隔的片段。你的问题不是很清楚,但你似乎期望换行符分隔的部分 - 这不是不带引号的替换的作用。
  3. 将每一部分视为通配符模式,如果它与一个或多个文件名匹配,则将该部分替换为匹配文件名列表。

第 2 步和第 3 步通俗地称为“split+glob 运算符”,这几乎不是你想要的始终在变量和命令替换周围使用双引号,除非您确切知道为什么需要省略引号

要在 shell 中逐行处理文件,请使用while read环形:

jq -cr '.[]' <"$1" |
  while IFS= read -r line; do
    printf '%s\n' "$line"
  done

但您最好还是使用其他工具。 Shell 本身不擅长处理大量字符串数据。

答案2

默认情况下,echo始终输出尾随换行符。

您可以将-n参数传递给 来echo阻止它这样做。

man echo

-n 不输出尾随换行符

编辑:

这里的“问题”不在你的cat $PWD/$1 | jq -cr '.[]'命令中,而是在行echo本身中,或更准确地说,在for循环中。通过循环,您可以逐字for拆分传递给它的内容(命令的输出)。jq

因此,本质上,您将由空格分隔的每个字符串一一传递给 echo 命令,默认情况下,每次执行该命令时都会添加一个尾随换行符。

相关内容