我正在编写脚本以从文件读取命令并执行特定命令。我希望我的脚本能够处理单个输入参数,或者当参数是包含参数的文件名时。在逐行读取文件时读取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