【发布时间】:2021-05-08 04:03:45
【问题描述】:
我希望对 foo.txt 中列出的每一行执行一个命令,其中 foo.txt 的每一行都是一个文件名。
这个问题得到了很多人的大力支持,并尝试了while read,another while read,我现在正在尝试做for loop。但是,我开始认为问题出在循环体中。
#!/bin/bash
File=/mnt/d/R_projects/EC/foo.txt
Lines=$(cat $File)
for Line in $Lines
do
echo "fastp -i /mnt/d/R_projects/EC/download/fastq/$Line -o /mnt/e/EC/fastp_trimmed/$Line"
./fastp -i /mnt/d/R_projects/EC/download/fastq/$Line -o /mnt/e/EC/fastp_trimmed/$Line
done
不幸的是,我收到了错误: 错误:无法打开文件:/mnt/d/R_projects/EC/download/fastq/SRR6132950_1.fastq
文件存在,并且执行less 确认。
奇怪的是,回声并没有回应我的期望,而是说:
" -o /mnt/e/EC/fastp_trimmed/SRR6132950_1.fastqRR6132950_1.fastq"
什么可能导致此问题?好像前半段被剪掉了一样。
【问题讨论】:
-
Lines=$(cat $File)是一个 UUOc(不必要地使用cat)。重定向是正确的方法。在你可以重定向一行并在for循环中逐行读取它之前,你需要将IFS设置为'\n'。然后你可以做for i in $(< somefile); do ... -
您的文件可能包含回车符(即 CRLF 而不是 LF),因为您从 Windows 复制、访问或编辑了它。删除它们;现有的问题有数百个。
-
关于 DOS/Windows 文件(带有 CRLF 行结尾)的典型问题是:Are shell scripts sensitive to encoding and line endings? 您还可以在
while read循环中修剪 CR(在 bash 中,但不是在所有其他 shell 中),使用while IFS=$'\r' read Line; do ... done <"$File" -
如果你正在处理回车字符,我希望你知道你可以使用
dos2unix命令? :-)