Linux 为什么for循环中的file命令行为如此荒谬
这个shell脚本将惊人地报告Linux 为什么for循环中的file命令行为如此荒谬,linux,bash,shell,for-loop,echo,Linux,Bash,Shell,For Loop,Echo,这个shell脚本将惊人地报告(文件名太长)。我猜脚本在文件中提供了3次$file\u列表 但是,如果我用一个简单的echo来更改file命令,那么脚本将按预期逐行打印当前目录中的所有文件。迭代find的结果不是一个好主意。改用它的exec选项: #!/bin/sh file_list=`find . -type f` IFS=$(echo) #this enables for loop to break on newline for file_ in $file_list; do fi
(文件名太长)
。我猜脚本在文件
中提供了3次$file\u列表
但是,如果我用一个简单的
echo
来更改file
命令,那么脚本将按预期逐行打印当前目录中的所有文件。迭代find
的结果不是一个好主意。改用它的exec
选项:
#!/bin/sh
file_list=`find . -type f`
IFS=$(echo) #this enables for loop to break on newline
for file_ in $file_list; do
file $file_
done
您正在将
IFS
设置为null并禁用分词。因此文件
包含find
的整个输出。这将有点太长,命令行无法工作<代码>回显正在“工作”,因为换行符可以显示。尝试在循环中使用printf%s“$file”
或declare-p file
,查看得到的结果。另请参阅,了解如何正确地从流中逐行读取数据。并阅读以了解为什么这是一个坏主意。您可能打算使用IFS=$(echo)
(命令替换,而不是参数扩展)。但这仍然是个坏主意。即使是IFS=$(echo)
也不起作用,因为命令替换会去除尾随的换行符,所以IFS仍然是空的
find -type f -exec file {} \;