gpt4 book ai didi

Bash 脚本,当我不希望 echo 换行时,它会换行

转载 作者:行者123 更新时间:2023-12-02 20:03:46 26 4
gpt4 key购买 nike

我有一个 bash 脚本,其中包含一对 curl,通过其他一些内置函数进行管道传输。我想打印每个 curl 的结果,然后解析结果并发出包含附加信息的第三行。最终输出应如下所示:

https://e.thingzz.com/eqvjzc23xqo2s
https://e.thingzz.com/o7jlafrot2fok
https://e.thingzz.com/c/eqvjzc23xqo2s/o7jlafrot2fok

相反,它看起来像:

https://e.thingzz.com/eqvjzc23xqo2s
https://e.thingzz.com/o7jlafrot2fok
/o7jlafrot2fokv.com/c/eqvjzc23xqo2s

由于某种原因,它以前两行的精确长度换行。

脚本:

#!/usr/bin/env bash
function myCurl()
{
curl ... | ... | ...
#omitted, results in printing a url like 'https://e.thingzz.com/UUID'
}

# param validation omitted
URL1=$(myCurl "${1}")
URL2=$(myCurl "${2}")
# print both URLs
echo $URL1
echo $URL2

# Parse URLs to get ID at end
# I've also tried using `cut`, in case there were invisible characters?
# I don't really know what I'm talking about.
URLID1=$(echo $URL1 | awk -F 'https://thing.com/' '{print $2}')
URLID2=$(echo $URL2 | awk -F 'https://thing.com/' '{print $2}')

# Doesn't work. Looks like:
# /o7jlafrot2fokv.com/c/eqvjzc23xqo2s
echo https://thing.com/c/${URLID1}/${URLID2}
# Proves I can echo something longer
echo doneaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# Also wraps, exactly like the `echo` version
echo $URLID1 $URLID2 | awk '{ printf "https://thing.com/c/%s/%s", $1, $2 }'

我远不是 bash 专家,也不知道这里发生了什么。我已经尝试从命令行(而不是调用脚本)对此进行变体,并且它有效。我真的很茫然。

编辑:我将 SCANID1 替换为 URLID1(也替换为 2)。它们是复制粘贴错误。

最佳答案

正如 Jonathan Leffler 在评论中指出的那样,最可能的解释是数据中存在 Windows (CRLF) 行结尾。 Unix 使用 LF 行结尾。在终端上,CR 字符将光标移动到行首,而不将其移动到下一行。例如,如果您运行

printf '%s\r%s\n' wibble foo

您将看到 fooble 因为显示了 wibble,然后光标移动到该行的开头,并且 foo 覆盖了该行的开头颤动

您的脚本与示例输出不完全匹配,但似乎该行

echo https://thing.com/c/${SCANID1}/${SCANID2}

生成的输出在行首有一个斜线和SCANID2的值。发生这种情况是因为 SCANID1 的值以 CR 字符结尾。

要使脚本对 Windows 行结尾具有鲁棒性,请删除任何 CR 字符,或至少删除行末尾的任何 CR 字符(如果在其他位置有 CR 字符,则数据会出现其他问题)。在 bash 中,"${var%$'\r'}" 给出 var 的值减去尾随的 CR(如果该值以 CR 结尾),并给出该值如果不以 CR 结尾则保持不变。

我建议尽早剥离 CR 以避免出现任何问题:

URL1=$(myCurl "${1}"); URL1=${URL1%$'\r'}
URL2=$(myCurl "${2}"); URL2=${URL2%$'\r'}

(您不能将命令替换和截断组合在单个赋值中。)

但是您也可以在 awk 阶段执行此操作:

SCANID1=$(echo "$URL1" | awk -F 'https://thing.com/' '{print sub("\r", "", $2)}')

请注意,此处无需调用 awk。

SCANID1=${URL1#*https://*/}

关于Bash 脚本,当我不希望 echo 换行时,它会换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55194881/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com