本人在通過Bash Shell下載GRE資料時,相關命令在執行過程中出現報錯,導致文件重命名出錯。

報錯如下value too great for base (error token is "08"),查閱資料後,原是進制的關係,現將操作過程整理出來。


Origin

想查找GRE常用詞彙(vocabulary),點開了majortests.comGRE Word Lists,共1500個詞彙,分爲15個wordlist

Each of the 15 wordlists contains 100 important words.

前10個屬於Basic GRE Words,後5個屬於Advanced GRE Words,提供PDF下載,鏈接形式爲

http://www.majortests.com/word-lists/word-list-01.pdf
...
...
http://www.majortests.com/word-lists/word-list-15.pdf

直接通過瀏覽器另存爲下載太過繁瑣且低效,故打算通過Shell Script實現。

Requirements

想要實現的需求 1. 通過Shell Scirpt實現整個操作過程; 2. 能夠查看下載進度; 3. 下載的文件能重命名爲自己想要的形式;

Analysis

需求分析

  1. 循環可通過for實現
  2. 下載可通過命令curl實現
  3. 查看下載進度可通過curl的參數-#實現
  4. 文件重命名可通過curl的參數-o(小寫字母o)實現
    • 大寫字母O是保留其在遠程服務器中的名字

Procedure

以下是完整操作過程

Testing1

第1次測試目的:實現數值從0115的自動生成

for i in {01..15};do
    echo $i
done

操作過程

[flying@lempstacker majortests]$ for i in {01..15};do echo $i;done
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
[flying@lempstacker majortests]$

Testing2

第2次測試目的:實現下載時進度條顯示

for i in {01..15};do
	curl -O# 'http://www.majortests.com/word-lists/word-list-'$i'.pdf'
done

操作過程

[flying@lempstacker majortests]$ for i in {01..15};do
> curl -O# 'http://www.majortests.com/word-lists/word-list-'$i'.pdf'
> done
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
[flying@lempstacker majortests]$ ls *.pdf
word-list-01.pdf  word-list-05.pdf  word-list-09.pdf  word-list-13.pdf
word-list-02.pdf  word-list-06.pdf  word-list-10.pdf  word-list-14.pdf
word-list-03.pdf  word-list-07.pdf  word-list-11.pdf  word-list-15.pdf
word-list-04.pdf  word-list-08.pdf  word-list-12.pdf
[flying@lempstacker majortests]$

Testing3 Error

第3次測試目的:下載同時實現文件的重命名操作

for i in {01..15};do
    #類似於三元運算
    [[ $i -le 10 ]] && level='basic' || level='advanced'
    # if [[ $i -le 10 ]]; then
    #     level='basic'
    # else
    #     level='advanced'
    # fi
	curl -# -o 'greWords-'$i'-'$level'.pdf' 'http://www.majortests.com/word-lists/word-list-'$i'.pdf'
done

操作過程

[flying@lempstacker majortests]$ for i in {01..15};do
> [[ $i -le 10 ]] && level='basic' || level='advanced'
> curl -# -o 'greWords-'$i'-'$level'.pdf' 'http://www.majortests.com/word-lists/word-list-'$i'.pdf'
> done
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
bash: [[: 08: value too great for base (error token is "08")
######################################################################## 100.0%
bash: [[: 09: value too great for base (error token is "09")
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
[flying@lempstacker majortests]$ ls *basic*
greWords-01-basic.pdf  greWords-04-basic.pdf  greWords-07-basic.pdf
greWords-02-basic.pdf  greWords-05-basic.pdf  greWords-10-basic.pdf
greWords-03-basic.pdf  greWords-06-basic.pdf
[flying@lempstacker majortests]$ ls *advance*
greWords-08-advanced.pdf  greWords-12-advanced.pdf  greWords-15-advanced.pdf
greWords-09-advanced.pdf  greWords-13-advanced.pdf
greWords-11-advanced.pdf  greWords-14-advanced.pdf
[flying@lempstacker majortests]$

出現報錯

bash: [[: 08: value too great for base (error token is "08")
bash: [[: 09: value too great for base (error token is "09")

直接導致08, 09文件重命名錯誤

Error Analysis

查閱資料後得知是進制原因,08以數字0開頭,Shell會嘗試將其解釋爲8進制(octal),不是一個真實的數字(valid number),導致報錯。

解決方案是在變量之前添加10#,強制讓bash將其解釋爲10進制(decimal)

Prepend the string “10#” to the front of your variables. That forces bash to treat them as decimal, even though the leading zero would normally make them octal. — Bash error: value too great for base (error token is “09”)

Testing4

第4次測試目的:下載同時實現文件按要求重命名

for i in {01..15};do
    #類似於三元運算,在變量前添加10#
    [[ 10#$i -le 10 ]] && level='basic' || level='advanced'
	curl -# -o 'greWords-'$i'-'$level'.pdf' 'http://www.majortests.com/word-lists/word-list-'$i'.pdf'
done

操作過程

[flying@lempstacker majortests]$ for i in {01..15};do
> [[ 10#$i -le 10 ]] && level='basic' || level='advanced'
> curl -# -o 'greWords-'$i'-'$level'.pdf' 'http://www.majortests.com/word-lists/word-list-'$i'.pdf'
> done
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
######################################################################## 100.0%
[flying@lempstacker majortests]$ ls *.pdf
greWords-01-basic.pdf  greWords-06-basic.pdf  greWords-11-advanced.pdf
greWords-02-basic.pdf  greWords-07-basic.pdf  greWords-12-advanced.pdf
greWords-03-basic.pdf  greWords-08-basic.pdf  greWords-13-advanced.pdf
greWords-04-basic.pdf  greWords-09-basic.pdf  greWords-14-advanced.pdf
greWords-05-basic.pdf  greWords-10-basic.pdf  greWords-15-advanced.pdf
[flying@lempstacker majortests]$

最終實現目標


References


Change Logs

  • 2016.08.04 10:47 Thu Asia/Shanghai
    • 初稿完成

  • Note Time: 2016.08.04 10:47 Thu
  • Note Location: Asia/Shanghai
  • Writer: lempstacker