
请问这个脚本错误在哪里:
#!/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