我正在編寫腳本以從文件讀取命令並執行特定命令。我希望我的腳本能夠處理單個輸入參數,或者當參數是包含參數的文件名時。在逐行讀取文件時讀取bash腳本中文件的最後一行
我的代碼如下工作,除了一個問題,它忽略了文件的最後一行。所以,如果文件如下。
file.txt的
file1
file2
下面貼只運行該腳本file.txt的命令
for currentJob in "[email protected]"
do
if [[ "$currentJob" != *.* ]] #single file input arg
then
echo $currentJob
serverJobName="$(tr '[A-Z]' '[a-z]' <<< "$currentJob")" #Change to lowercase
#run cURL job
curl -o "$currentJob"PisaInterfaces.xml http://www.ebi.ac.uk/msd-srv/pisa/cgi-bin/interfaces.pisa?"$serverJobName"
else #file with list of pdbs
echo "Reading "$currentJob
while read line; do
echo "-"$line
serverJobName="$(tr '[A-Z]' '[a-z]' <<< "$line")"
curl -o "$line"PisaInterfaces.xml http://www.ebi.ac.uk/msd-srv/pisa/cgi-bin/interfaces.pisa?"$serverJobName"
done < "$currentJob"
fi
done
有,當然,顯而易見的解決辦法,其中while循環後,我再說一遍循環內部的步驟用最後一個文件來完成這些命令,但這是不可取的,因爲我在while循環中做的任何更改都必須在while循環之外重複。我已經在網上搜索,找不到任何人提出這個確切的問題。我確定它在那裏,但我沒有找到它。
我得到的輸出如下。
>testScript.sh file.txt
Reading file.txt
-file1
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 642k 0 642k 0 0 349k 0 --:--:-- 0:00:01 --:--:-- 492k
我的bash的版本是3.2.48
您的建議奏效,謝謝。根據你的回答,似乎在每次迭代結束時,$ line被設置爲下一行讀取的下一個值,然後它檢查是否有更多的行要用「read line」參數讀取。 [[-n「$ line」]]檢查$ line是否爲空?它是否正確。你介意第二學期的語法究竟是什麼意思? – PhiloEpisteme 2013-03-19 05:07:49
感謝您的描述。我意識到邏輯的結構和||的含義跡象。我知道C++,但我不熟悉-n命令。它是否僅僅意味着「是空的」? – PhiloEpisteme 2013-03-19 18:15:31