附加到bash中的字符串

时间:2019-01-18 11:38:51

标签: bash awk

我正在尝试使用?Extractcurl获取下载URL,然后再向该URL附加内容。

以下是我的代码的一部分:

awk

我得到的是,它在一开始就以某种方式替换了零件。

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

我在做什么错了?

3 个答案:

答案 0 :(得分:3)

十六进制转储字符串时,您会看到它使用的是Windows行尾(带有回车符):

echo $IMAGE | hexdump -C
00000000  68 74 74 70 73 3a 2f 2f  64 6f 77 6e 6c 6f 61 64  |https://download|
00000010  73 2e 72 61 73 70 62 65  72 72 79 70 69 2e 6f 72  |s.raspberrypi.or|
00000020  67 2f 72 61 73 70 62 69  61 6e 5f 6c 69 74 65 2f  |g/raspbian_lite/|
00000030  69 6d 61 67 65 73 2f 72  61 73 70 62 69 61 6e 5f  |images/raspbian_|
00000040  6c 69 74 65 2d 32 30 31  38 2d 31 31 2d 31 35 2f  |lite-2018-11-15/|
00000050  32 30 31 38 2d 31 31 2d  31 33 2d 72 61 73 70 62  |2018-11-13-raspb|
00000060  69 61 6e 2d 73 74 72 65  74 63 68 2d 6c 69 74 65  |ian-stretch-lite|
00000070  2e 7a 69 70 0d 0a                                 |.zip..|
00000076

要解决此问题,请使用

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

答案 1 :(得分:2)

问题显然是,您的$IMAGE包含/末尾是'\ r (carriage return). So you've actually appended ".sha256" as you expected to“ something \ r.sha256”,在回显时表示...。something ,将光标移回到行首.sha256。长话短说,去掉“ \ r”。例如:

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

答案 2 :(得分:1)

由于您正在使用bash,因此可以使用子字符串替换,即。替换\r var中的IMAGE

$ 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

或通过设置记录分隔符RS在awk部分中为此做准备:

... | awk -v RS="\r?\n" '/Location/ {print $2}'

经过gawk,mawk和original-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                                             |..|