附加到bash中的字符串

附加到bash中的字符串,bash,awk,Bash,Awk,我正在尝试使用curl和awk获取一个下载URL,然后想在该URL中添加一些内容 下面是我的一些代码片段: IMAGE=$(curl -I -s https://downloads.raspberrypi.org/raspbian_lite_latest | awk '/Location/ {print $2}') CHECKSUM="$IMAGE.sha256" echo $IMAGE echo $CHECKSUM 我得到的是,它在一开始就以某种方式更换部件 https://downloa

我正在尝试使用
curl
awk
获取一个下载URL,然后想在该URL中添加一些内容

下面是我的一些代码片段:

IMAGE=$(curl -I -s https://downloads.raspberrypi.org/raspbian_lite_latest | awk '/Location/ {print $2}')
CHECKSUM="$IMAGE.sha256"

echo $IMAGE
echo $CHECKSUM
我得到的是,它在一开始就以某种方式更换部件

https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2018-11-15/2018-11-13-raspbian-stretch-lite.zip
.sha256/downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2018-11-15/2018-11-13-raspbian-stretch-lite.zip
我有点无助,因为下面的工作与预期相符:

A="https""://abc.org/a_b/a.zip" # looks weird, but full URLs are not allowed here
B="$A.sha256"
echo $B

我做错了什么?

问题显然是,
$IMAGE
包含/结束于结尾的“\r
(回车)。因此,您实际添加了“.sha256”,正如您预期的那样
“something\r.sha256”,它在被回显时表示
something
,光标回到行的开头,
.sha256
。长话短说,去掉“\r”。例如:

IMAGE=$(curl -I -s https://downloads.raspberrypi.org/raspbian_lite_latest | awk '/Location/ {sub(/\r$/, "", $2); print $2}')

当您转储字符串时,您会看到它使用windows行结尾(带回车符):

要解决这个问题,请使用

IMAGE=$(curl -I -s https://downloads.raspberrypi.org/raspbian_lite_latest | awk '/Location/ {print $2}' | tr -d "\r")

由于您使用的是bash,因此可以使用子字符串替换,即替换
图像
变量中的
\r

$ CHECKSUM="${IMAGE/$'\r'/}.sha256"
$ echo $CHECKSUM 
https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2018-11-15/2018-11-13-raspbian-stretch-lite.zip.sha256
或者在awk部件中设置记录分隔符来准备:

... | awk -v RS="\r?\n" '/Location/ {print $2}'
用目瞪口呆、mawk和原始awk测试。令人惊讶的是,
busybox awk
自己删除了它:

$ echo -e \\r | busybox awk '{print $1}' | hexdump -C
00000000  0a                                                |.|
但例如:

$ echo -e \\r | gawk '{print $1}' | hexdump -C
00000000  0d 0a                                             |..|

你想达到什么目标?或者确切的要求是什么?
$ echo -e \\r | gawk '{print $1}' | hexdump -C
00000000  0d 0a                                             |..|