Shell-Script
Shell中的字元串到整數
我目前正在開發一個名為“dmCLI”的項目,意思是“下載管理器命令行界面”。我正在使用 curl 多部分下載文件。而且我的程式碼有問題。我無法將字元串轉換為 int。
這是我的完整程式碼。我還將我的程式碼上傳到了 Github Repo。這裡是: dmCLI GitHub 儲存庫
#!/bin/bash RED='\033[0;31m' NC='\033[0m' help() { echo "dmcli [ FILENAME:path ] [ URL:uri ]" } echo -e "author: ${RED}@atahabaki${NC}" echo -e " __ _______ ____" echo -e " ___/ /_ _ / ___/ / / _/" echo -e "/ _ / ' \/ /__/ /___/ / " echo -e "\_,_/_/_/_/\___/____/___/ " echo -e " " echo -e "${RED}Downloading${NC} has never been ${RED}easier${NC}.\n" if [ $# == 2 ] then filename=$1; url=$2 headers=`curl -I ${url} > headers` contentlength=`cat headers | grep -E '[Cc]ontent-[Ll]ength:' | sed 's/[Cc]ontent-[Ll]ength:[ ]*//g'` acceptranges=`cat headers | grep -E '[Aa]ccept-[Rr]anges:' | sed 's/[Aa]ccept-[Rr]anges:[ ]*//g'` echo -e '\n' if [ "$acceptranges" = "bytes" ] then echo File does not allow multi-part download. else echo File allows multi-part download. fi echo "$(($contentlength + 9))" # if [acceptranges == 'bytes'] # then # divisionresult = $((contentlength/9)) # use for to create ranges... else help fi # First get Content-Length via regex or request, # Then Create Sequences, # After Start Downloading, # Finally, re-assemble to 1 file.
我想將 contentlength 的值除以 9。我試過這個:
echo "$(($contentlength/9))"
它低於錯誤:
/9") 語法錯誤:算術運算符無效(錯誤標記是“
我正在使用用 node.js 編寫的 localhost。我添加了頭部響應。它返回請求文件的 Content-Length,上面的 dmCLI.sh 正確獲取 Content-Length 值。
./dmcli.sh home.html http://127.0.0.1:404/
對http://127.0.0.1:404/的 HEAD 請求返回:Content-Length: 283, Accept-Range: bytes
dmCLI 用於獲取值,但是當我想訪問它的值時,它不起作用。
簡單的操作如下:
echo "$contentlength"
但我無法通過以下方式訪問它:
echo "$contentlength bytes"
和這裡:
echo "$(($contentlength + 9))"
返回 9,但我期待 292。問題出在哪裡?為什麼它不工作?
下面的正則表達式將提取字節數,僅提取數字:
contentlength=$( LC_ALL=C sed ' /^[Cc]ontent-[Ll]ength:[[:blank:]]*0*\([0-9]\{1,\}\).*$/!d s//\1/; q' headers )
進行上述更改後,
contentlength
變數將僅由十進制數字組成(前導 0 被刪除,因此 shell 不會將數字視為八進制),因此下面的 2 行將顯示相同的結果:echo "$(($contentlength/9))" echo "$((contentlength/9))"
headers=`curl -I ${url} > headers` contentlength=`cat headers | grep -E '[Cc]ontent-[Ll]ength:' | sed 's/[Cc]ontent-[Ll]ength:[ ]*//g'` echo "$(($contentlength/9))"
它低於錯誤:
/9")syntax error: invalid arithmetic operator (error token is "
HTTP 標頭總是以 CR/LF 結尾,而不僅僅是 LF;您的
cat headers | ...
命令擴展將刪除結尾的 LF,但不理會 CR,這將導致那個奇怪的錯誤。% var=`printf "%s\r\n" 333` % echo var={$var} }ar={333 % echo "$((var / 3))" ")syntax error: invalid arithmetic operator (error token is "