附加到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 |..|