Как уже заметил Джонатан Леффлер в комментарии, наиболее вероятным объяснением является наличие в данных окончания строк Windows (CRLF). Unix использует LF окончания строк. На терминале символ CR перемещает курсор в начало строки, не перемещая его на следующую строку. Например, если вы запустите
printf '%s\r%s\n' wibble foo
вы увидите fooble
, поскольку отображается wibble
, затем курсор перемещается в начало строки и foo
перезаписывает начало wibble
.
Ваш скрипт не полностью соответствует вашему примеру вывода, но кажется, что строка
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://*/}