我看过“for”循环的文章。它在空格、制表符或换行符等空白出现时拆分。为了解决这个问题,我有以下额外的命令行:

IFS=$'\n'

但是,当我试图解决上述关于以下详细信息的场景时(我在当前目录中有两个文件:“input1.txt”和“input.txt”):
bash命令:
bash script.sh 'input*'

下面是script.sh中的“for”循环块
for line in $(cat $1)
...
...
done;

执行时出现以下错误:
cat: input1.txt input.txt*: No such file or directory

注意:我想将input1.txt和input.txt文件都分类

最佳答案

通过重置$IFS,可以禁用将导致$1中模式扩展视为单独文件名的单词拆分。这是以正确的方式做这件事的另一个原因。但首先,假设您真的希望将模式传递给脚本,而不是使用bash script.sh input*让shell将模式扩展为脚本的文件列表。那么你的循环应该是

cat $1 | while IFS= read -r line; do
    ...
done

但是,如果任何匹配的文件本身的名称中有空格,则此操作将不起作用;使用input a.txtinput b.txt$1将扩展到4个单词inputa.txtinputb.txt。相反,您应该让shell进行扩展,并将每个匹配的文件作为单独的参数传递:
bash script.sh input*

在你的剧本里:
for f in "$@"; do
    while IFS= read -r line; do
        ...
    done < "$f"
done

关于linux - 使用空格,带有多个输入文件的制表符在“for”循环中读取完整行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35774850/

10-10 12:24
查看更多