String 在Linux bash中从Windows中形成的文本文件中读取内容
我正在尝试使用wget和url从数据库下载文件。例如 wget“” 所以url的格式如下:($idnumber).pdb“ 但是我有很多文件要下载;所以我编写了一个bash脚本,从文本文件中读取id_编号,形成url字符串,然后由wget下载String 在Linux bash中从Windows中形成的文本文件中读取内容,string,bash,string-concatenation,String,Bash,String Concatenation,我正在尝试使用wget和url从数据库下载文件。例如 wget“” 所以url的格式如下:($idnumber).pdb“ 但是我有很多文件要下载;所以我编写了一个bash脚本,从文本文件中读取id_编号,形成url字符串,然后由wget下载 !/bin/bash while read line do url="http://www.rcsb.org/pdb/files/$line.pdb" echo -e $url wget $url done < id_numbers.txt 所以
!/bin/bash
while read line
do
url="http://www.rcsb.org/pdb/files/$line.pdb"
echo -e $url
wget $url
done < id_numbers.txt
所以,.pdb
被回复为http
。我不明白为什么。有人有想法吗?
我如何格式化它,使url是
"http://www.rcsb.org/pdb/files/($idnumber).pdb"
??
非常感谢
注意。这个问题被标记为“如何在bash中连接字符串?”的重复项,但我实际上是在问其他问题。我在问这个问题之前阅读了这个问题,结果发现我的问题是在Windows中准备txt文件,而不是真正的字符串关联。我编辑了问题标题。我希望现在问题更清楚。尝试t他的:
url="http://www.rcsb.org/pdb/files/"$line
$url=$url".pdb"
有关更多信息,请选中,
-e
echo选项用于输出所需内容,无需插入新行,此处不需要它
我还怀疑您包含ID的文件格式不正确,您是在哪个操作系统上创建的
无论如何,您可以通过以下方式简化脚本:
!/bin/bash
while read line
do
wget "http://www.rcsb.org/pdb/files/$line.pdb"
done < id_numbers.txt
听起来您的id_numbers.txt文件具有DOS/Windows样式的行尾(回车符后跟换行符),而不是普通的unix行尾(仅换行符)。结果是,
read
认为该行以回车结束,$line
实际上在结尾处有一个回车,这会嵌入到url中,导致各种混乱
有几种方法可以解决此问题。在使用变量时,可以使用bash修剪该变量的回车:
url="http://www.rcsb.org/pdb/files/${line%$'\r'}.pdb"
或者您可以让read
通过告诉它回车符算作空格来修剪它(read
将从它读取的空格中修剪前导空格和尾随空格):
或者您也可以使用类似于dos2unix的命令(或操作系统上的任何等效命令)转换id_numbers.txt文件。您可以发布几行
id_numbers.txt
吗?使用cat-a
显示id_numbers.txt
。此外,您几乎可以肯定读取-r
标志,尽管在这种情况下它可能会或可能不会更改任何内容。或者id_nums.txt是在windows上创建的,并且有\r\n行结尾。Ah Gordon已经知道了这一点。dos2unix文件
。祝大家好运。是的,我也怀疑这一点,我回答的第二句话。您好,您是对的。我在Windows的记事本++中形成了.txt文件。这导致了问题。我在那里有echo
命令来查看我正在形成的url,以便我可以进行故障排除。感谢您的回复。在本cas中e您只需更改@Gordon所说的行分隔符(IFS)。如果您想要干净的东西,我的代码仍然有效(只需在while循环之前添加IFS=$'\r'
).相当于,但更长,仍然无法解决回车问题。我实际上也尝试过同样的方法:)但切普纳是对的,并不能解决回车问题。这很有效!非常感谢。我认为这是因为回车的原因,但我还没有想出如何摆脱它。非常感谢!
for i in $(0 9) ; do echo "$i" >> id_numbers.txt ; done
url="http://www.rcsb.org/pdb/files/${line%$'\r'}.pdb"
while IFS=$'\r' read line