Shell-Script

Shell中的字元串到整數

  • March 24, 2019

我目前正在開發一個名為“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 "

引用自:https://unix.stackexchange.com/questions/506240