调用 find 的 bash 脚本中的语法错误

调用 find 的 bash 脚本中的语法错误

请问这个脚本错误在哪里:

#!/bin/bash
rep="git"

files=`find' ${rep} '-type f`
for f in ${files} do
    echo $f
done

当我find git -type f在 shell 中单独运行时,它起作用了!

答案1

单引号中的字符串不会被插入。这意味着,你正在尝试跑步

find ' ${rep} '-type f

删除单引号。如果您确实需要引用 $rep (例如因为它包含空格),请使用双引号:

files=`find "$rep" -type f`

请注意,双引号内没有空格。您正在搜索“git”,而不是“git”,对吧?

答案2

不要将 的输出存储find在变量中。这是不可靠且低效的。效率低下,因为find必须在开始处理其输出之前完成运行;这在大型目录树上会产生影响。不可靠,因为即使您的命令语法正确, 的输出也find将由换行符分隔的文件名列表组成。除非已知文件名不包含换行符,否则这是不明确的。此外,您没有正确解析输出:使用不带引号的命令替换$(…),只要有空格(不仅仅是换行符),命令的结果就会被分解为单独的单词,并且这些单词被解释为 shell glob 模式。为了避免这种处理,请使用"$(…)"(始终在变量和命令替换周围加上双引号:"$foo", "$(foo)");这在这里不好,因为您需要分隔文件名。

find有一个内置功能来处理生成的文件:-exec操作。用它。这就是它的用途。

find "$rep" -type f -exec echo {} \;

如果您需要在每个文件上运行任意 shell 片段而不仅仅是单个命令,请调用 shell 作为命令。为了避免损坏文件名,请将其作为参数传递给 shell。

find "$rep" -type f -exec sh -c '
  echo "$0"
  # more shell commands ...
' {} \;

答案3

删除引号

文件=`查找'$rep' -type f`

正确的脚本是

#!/bin/bash
代表=“git”

文件=`查找 $rep -type f`
对于 ${files} 中的 f;做
    回声$f
完毕

答案4

'前后添加空格-type

相关内容