如果我在 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错误。有什么建议?
根据构造的bash手册页$(command):
Bash 通过执行命令并用命令的标准输出替换命令替换来执行扩展,并删除任何尾随的换行符。嵌入的换行符不会被删除,但在分词过程中可能会被删除。
所以tr不是问题,而是bash删除尾随的换行符,并在分词期间删除任何其他换行符。这是记录的行为。
我相信您在大多数地方都希望这种行为。如果您有一个包含文件名列表的文件,则:
for FILENAME in $(cat somefile)
do
...
done
Run Code Online (Sandbox Code Playgroud)
迭代文件名列表。您不希望换行符somefile弄乱您用作文件名的单词列表,甚至可能弄乱您的 for-do-done 循环。