Добавить к строке в Bash

Я пытаюсь получить URL для загрузки, используя curl и awk, и хочу добавить что-то к этому 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

Что я делаю не так?

4
задан James Brown 18 January 2019 в 13:57
поделиться

3 ответа

Так как вы используете bash, вы можете использовать замену подстроки, т.е. замените \r в IMAGE var:

$ CHECKSUM="${IMAGE/ 

или подготовьтесь к нему в части awk, установив разделитель записей RS:

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

Протестировано с gawk, 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                                             |..|
\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, установив разделитель записей RS:

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

Протестировано с gawk, 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                                             |..|
0
ответ дан James Brown 18 January 2019 в 13:57
поделиться

Проблема, очевидно, заключается в том, что ваш $IMAGE содержит / оканчивается завершающим '\ r (carriage return). So you've actually appended ".sha256" as you expected to "чем-то \ r.sha256", что при отражении означает .... something, курсор назад к началу линии, .sha256. Короче говоря, раздеться, что '\ r`. Например:

IMAGE=$(curl -I -s https://downloads.raspberrypi.org/raspbian_lite_latest | awk '/Location/ {sub(/\r$/, "", $2); print $2}')
0
ответ дан Ondrej K. 18 January 2019 в 13:57
поделиться

Когда вы hexdump вашей строки, вы видите, что использует оконные строки (с переводом каретки):

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")
0
ответ дан Jan Gassen 18 January 2019 в 13:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: