[英]Bash script, echo is wrapping when I don't want it to
我有一個bash腳本,它包裝了通過一對其他內置函數通過管道傳遞的curl
。 我想打印每個curl的結果,然后解析結果並發出包含其他信息的第三行。 最終輸出應如下所示:
https://e.thingzz.com/eqvjzc23xqo2s
https://e.thingzz.com/o7jlafrot2fok
https://e.thingzz.com/c/eqvjzc23xqo2s/o7jlafrot2fok
相反,它看起來像:
https://e.thingzz.com/eqvjzc23xqo2s
https://e.thingzz.com/o7jlafrot2fok
/o7jlafrot2fokv.com/c/eqvjzc23xqo2s
由於某種原因,它以前兩行的確切長度進行換行。
腳本:
#!/usr/bin/env bash
function myCurl()
{
curl ... | ... | ...
#omitted, results in printing a url like 'https://e.thingzz.com/UUID'
}
# param validation omitted
URL1=$(myCurl "${1}")
URL2=$(myCurl "${2}")
# print both URLs
echo $URL1
echo $URL2
# Parse URLs to get ID at end
# I've also tried using `cut`, in case there were invisible characters?
# I don't really know what I'm talking about.
URLID1=$(echo $URL1 | awk -F 'https://thing.com/' '{print $2}')
URLID2=$(echo $URL2 | awk -F 'https://thing.com/' '{print $2}')
# Doesn't work. Looks like:
# /o7jlafrot2fokv.com/c/eqvjzc23xqo2s
echo https://thing.com/c/${URLID1}/${URLID2}
# Proves I can echo something longer
echo doneaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# Also wraps, exactly like the `echo` version
echo $URLID1 $URLID2 | awk '{ printf "https://thing.com/c/%s/%s", $1, $2 }'
我距離bash專家還很遠,也不知道這里發生了什么。 我從命令行(而不是從調用腳本)嘗試過這種方法,並且可以正常工作。 我真的很茫然。
編輯:我用URLID1(以及2替換SCANID1)。 它們是復制粘貼錯誤。
正如喬納森·萊夫勒(Jonathan Leffler)在評論中所說,最可能的解釋是數據中存在Windows(CRLF)行尾。 Unix使用LF行尾。 在終端上,CR字符將光標移動到該行的開頭,而不將其移動到下一行。 例如,如果您運行
printf '%s\r%s\n' wibble foo
您會看到fooble
因為顯示了wibble
,然后光標移動到了該行的開頭,而foo
覆蓋了wibble
的開頭。
您的腳本與示例輸出不完全匹配,但似乎該行
echo https://thing.com/c/${SCANID1}/${SCANID2}
產生的輸出具有斜線,並且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://*/}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.