我看过“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.txt
和input b.txt
,$1
将扩展到4个单词input
,a.txt
,input
和b.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/