Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash-作为参数在路径上循环_Bash - Fatal编程技术网

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
的输出视为单个字符串,因此这不是一个解决方案。人们总是会做一些奇怪的事情来破坏东西,养成以一种不太容易破坏的方式编写脚本的习惯是一个好主意,即使你的解决方案适合你,你使用东西的方式。一旦其他人使用你的脚本,他们就会做你不愿意做的事情。