tr 命令在 $() 中使用并保存在变量中时无效

And*_*ejs 2 shell tr

如果我在 CLI 中运行:

curl time.com | sed -n 's/.*href="\([^"]*\).*/\1/p' | tr " " "\n"
Run Code Online (Sandbox Code Playgroud)

然后,正如预期的那样,我得到了一个从页面到 的经过清理的链接列表STDOUT,每个链接都在新行上。

但是,当我将它保存到一个变量并尝试echo从一个script.sh

PAGE_LINKS=$(curl time.com | sed -n 's/.*href="\([^"]*\).*/\1/p' | tr " " "\n")
echo $PAGE_LINKS
Run Code Online (Sandbox Code Playgroud)

我将所有链接放在一行上,空格分开。所以好像tr被忽略了。

我尝试了多种方法,包括类似的东西

HREFS=$(tr " " "\n" < "{PAGE_LINKS}")
echo $HREFS
Run Code Online (Sandbox Code Playgroud)

但后来我得到file too long错误。有什么建议?

Bru*_*ger 5

根据构造的bash手册页$(command)

Bash 通过执行命令并用命令的标准输出替换命令替换来执行扩展,并删除任何尾随的换行符。嵌入的换行符不会被删除,但在分词过程中可能会被删除。

所以tr不是问题,而是bash删除尾随的换行符,并在分词期间删除任何其他换行符。这是记录的行为。

我相信您在大多数地方都希望这种行为。如果您有一个包含文件名列表的文件,则:

for FILENAME in $(cat somefile)
do
     ...
done
Run Code Online (Sandbox Code Playgroud)

迭代文件名列表。您不希望换行符somefile弄乱您用作文件名的单词列表,甚至可能弄乱您的 for-do-done 循环。