簡體   English   中英

Bash腳本,當我不希望它回顯時

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM