2015-11-13 27 views
1

這是一個縮寫版本的腳本,用於從裝有自動裝載器的EXB-8500讀取8毫米磁帶(一次最多隻有10個磁帶)。它以磁帶數據(直接二進制)形式存儲,並將其保存到以磁帶的4位數字(例如D1002.dat)命名的文件中,這些文件位於我們的主存儲器和備份中。在此期間,它正在記錄信息並在終端中顯示其狀態,以便我們可以看到它有多遠。0999:基準值太大(錯誤標記爲「0999」)

#!/bin/bash 
echo "Please enter number of tapes: [int]" 
read i 
j=1 
until [ $i -lt $j ] 
do 
    echo "What is the number of tape $j ?" 
    read Tape_$j 
    ((j += 1)) 
done 
echo "Load tapes into the tower and press return when the drive is ready" 
read a 
j=1 
until [ $i -lt $j ] 
do 
    k="Tape_$j" 
    echo "tower1 $j D$(($k)) `date` Begin" 
    BEG=$j" "D$(($k))" "`date`" ""Begin" 
    echo "tower1 $j D$(($k)) `date` End" 
    END=$j" "D$(($k))" "`date`" ""End" 
    echo "$BEG  $END" 
    echo "$BEG  $END" 
    sleep 2 
    ((j += 1)) 
done 
echo "tower1 done" 

一切都是h until直到我們不到1000(startig在0999)。錯誤代碼是./tower1: 0999: Value too great for base (error token is "0999")。現在我已經意識到這是因爲腳本在輸入前導0時強制執行八進制值,並且我知道我應該在腳本的某個位置插入10#,但問題在於:Where?

還有一種方法可以讓我將Tape_$j定義爲一個字符串嗎?我覺得這樣可以清除很多這些問題

要得到錯誤,請運行腳本,然後定義所需的多個磁帶(至少一個,lol),並在磁帶名稱中插入前導0

例:

./test 
Please enter number of tapes: [int] 
1 
What is the number of tape 1? 
0999 

./test: 0999: Value too great for base (error token is "0999") 
+0

我應該向腳本提供哪些輸入以獲取錯誤? – choroba

+1

「0」前綴表示數字「9」不存在的八進制數。 – karakfa

+0

@choroba:感謝您的快速回復,請檢查我的編輯是否有更新。 karakfa:我知道。閱讀我的最後一段。 – SpaceCadet

回答

1

你不想使用$ k作爲一個數字,而是作爲一個字符串。您使用數字表達式將變量值計算爲變量名稱。這是非常糟糕的做法。

幸運的是,您可以在bash中使用變量間接來實現您的目標。沒有涉及的數字,沒有錯誤拋出。

echo "tower1 $j ${!k} `date` Begin" 
BEG=$j" "D${!k}" "`date`" ""Begin" 

和其他地方一樣。

+0

它的工作原理!你能簡要介紹一下變量間接性以便將來參考,如果有人遇到過類似的問題? – SpaceCadet

+0

它在'男人bash'中有詳細描述。如上所述,它可以「使用變量值作爲變量名」。 – choroba