Bash-作为参数在路径上循环
如果我想在静态分配的目录上循环,我可以执行以下操作:Bash-作为参数在路径上循环,bash,Bash,如果我想在静态分配的目录上循环,我可以执行以下操作: cd /path/to/directory for file in * do echo 'Found file' $file done 如果我想将目录作为参数传递,那么我可以: cd $1 for file in * do echo 'Found file' $file done 如果我将$1参数移动到循环中,我会得到一个错误,因为它不是数组: for file in $1 do echo 'Found file'
cd /path/to/directory
for file in *
do
echo 'Found file' $file
done
如果我想将目录作为参数传递,那么我可以:
cd $1
for file in *
do
echo 'Found file' $file
done
如果我将$1
参数移动到循环中,我会得到一个错误,因为它不是数组:
for file in $1
do
echo 'Found file' $file
done
有没有更好的方法可以做到这一点,而不必先将
cd
放入目录?如果我理解正确,您正在尝试循环使用$1
指定的目录中的文件。在这种情况下,您可以执行以下操作:
for file in "$1"/*
do
echo 'Found file' "$file"
done
注意,我还用双引号将所有变量引用括起来。这几乎总是一个好主意,因为如果变量包含空格、制表符、通配符等(所有这些在文件名中都是合法的),它可以防止错误插入。另一方面,
*
不能被引用,否则它不会被扩展;因此,“$1”/*
被引用了一半以获得正确的治疗。如果我理解正确,您正试图在$1
指定的目录中循环文件。在这种情况下,您可以执行以下操作:
for file in "$1"/*
do
echo 'Found file' "$file"
done
注意,我还用双引号将所有变量引用括起来。这几乎总是一个好主意,因为如果变量包含空格、制表符、通配符等(所有这些在文件名中都是合法的),它可以防止错误插入。另一方面,
*
不能被引用,否则它不会被扩展;因此,“$1”/*
是获得正确治疗的一半。@Gordon Davidson的答案应该有效。他正在使用所调用的内容获取$1
中的任何内容。除了globbing,您也可以使用ls
for file in $(ls $1}); do
echo "Found file ${file}"
done
您可以使用backtics:
for file in `ls $1`; do
echo "Found file ${file}"
done
有很多方法可以让它发挥作用。如果只想打印属于文件(而不是子目录)的内容:
干杯 @Gordon Davidson的答案应该有用。他正在使用所调用的内容获取
$1
中的任何内容。除了globbing,您也可以使用ls
for file in $(ls $1}); do
echo "Found file ${file}"
done
您可以使用backtics:
for file in `ls $1`; do
echo "Found file ${file}"
done
有很多方法可以让它发挥作用。如果只想打印属于文件(而不是子目录)的内容:
干杯 这是受所有的缺点。感谢链接到那篇文章。据我所知,当文件名中有换行符时,问题就出现了。因此,如果这是我们在这里担心的边缘情况,我同意解析
ls
不是正确的方法。谢天谢地,我没有在文件名中添加换行符,所以在for
循环中使用ls
的输出从来没有遇到过任何问题。@jawguycooser使用$()
来获取ls
的输出,不仅会对包含换行符的文件名产生问题,还会对包含空格、制表符和shell通配符的文件名产生问题。(我使用macOS,所以空格在文件名中很常见。)有一些方法可以解决其中的一些问题,但不是全部(而且这项工作比它的价值还大)。直接使用通配符更简单、更可靠。@Gordondavison足够公平了。我想我属于那种在文件名中不使用特殊字符的人,所以我从来没有遇到过你描述的麻烦。(顺便说一句,解决方法不只是引用子shell吗?:用于“$(ls)”中的文件;do
)。不过,我认为自己是正确的。当生活在一个将空格、制表符和特殊字符放入文件名(真的吗?!)的世界中时,解析ls
的输出可能会有问题。对于“$(ls)”中的文件将ls
的输出视为单个字符串,因此这不是一个解决方案。人们总是会做一些奇怪的事情来破坏东西,养成以一种不太容易破坏的方式编写脚本的习惯是一个好主意,即使你的解决方案适合你,你使用东西的方式。一旦其他人使用你的脚本,他们就会做你不会做的事情。这可能会受到的所有缺点的影响。感谢链接到该文章。据我所知,当文件名中有换行符时,问题就出现了。因此,如果这是我们在这里担心的边缘情况,我同意解析ls
不是正确的方法。谢天谢地,我没有在文件名中添加换行符,所以在for
循环中使用ls
的输出从来没有遇到过任何问题。@jawguycooser使用$()
来获取ls
的输出,不仅会对包含换行符的文件名产生问题,还会对包含空格、制表符和shell通配符的文件名产生问题。(我使用macOS,所以空格在文件名中很常见。)有一些方法可以解决其中的一些问题,但不是全部(而且这项工作比它的价值还大)。直接使用通配符更简单、更可靠。@Gordondavison足够公平了。我想我属于那种在文件名中不使用特殊字符的人,所以我从来没有遇到过你描述的麻烦。(顺便说一句,解决方法不只是引用子shell吗?:用于“$(ls)”中的文件;do
)。不过,我认为自己是正确的。当生活在一个将空格、制表符和特殊字符放入文件名(真的吗?!)的世界中时,解析ls
的输出可能会有问题。对于“$(ls)”中的文件将ls
的输出视为单个字符串,因此这不是一个解决方案。人们总是会做一些奇怪的事情来破坏东西,养成以一种不太容易破坏的方式编写脚本的习惯是一个好主意,即使你的解决方案适合你,你使用东西的方式。一旦其他人使用你的脚本,他们就会做你不愿意做的事情。