在我的bash脚本中,我使用find通过通配符获取文件夹名称:
for i in $(find ${directory} -mindepth 1 -type d -name ${wildcard});
do
stuff=doStuff ${i}
done
doStuff() {
echo ${1}
return ${1}'/hello';
}
问题是当我这样做时,出现以下错误(可以说$ {i}对应于“ home / me / my_directory”):
line 111: '/home/me/my_directory': is a directory.
(第111行是带有'doStuff'的行)
我尝试这样做,无济于事:
for i in $(find ${directory} -mindepth 1 -type d -name ${wildcard});
do
stuff=doStuff "${i}"
done
显然是因为程序正在尝试执行目录,但是我只希望它作为我可以操纵的字符串。
引号和命令替换是您在这里遇到的问题。
您遇到的特定问题是因为shell试图运行/home/me/my_directory
使用环境变量调用的命令stuff=doStuff
。
您真正想要的(如果我没有正确解释的话)是doStuff
将value$i
作为参数运行,并将输出分配给变量stuff
。这样做的方法是将命令包装在中$()
。例如:
stuff="$(doStuff "$i")"
请注意,我还对所有内容都加了引号。这是为了防止shell对您不希望进行单词拆分的内容进行单词拆分(它将将单个参数/foo/bar baz
变为/foo/bar
和baz
)。
函数的输出也将用作返回值,而不是return
。
当您应该使用更多的引号时,还应该将其添加到其他所有引号中。这是脚本的完整版本:
doStuff() {
echo "${1}" >&2
printf '%s/hello' "$1";
}
IFS=$'\n'
for i in $(find "${directory}" -mindepth 1 -type d -name "${wildcard}");
do
stuff="$(doStuff "${i}")"
done
在尝试使用函数定义之前,必须先放置它。Shell无法像编译程序一样进行解析,它会多次遍历文件。它是自上而下的。
我还进行了修改doStuff
,将其发送echo
到STDERR,然后将其显示在终端上,然后将其printf
发送到STDOUT,将其捕获到变量中stuff
。
请注意,如果您的任何目录包含换行符,这仍然会有问题。但是,这是外壳的限制。文件路径不能包含的唯一字符是NULL char(\0
)。但是bash和其他shell无法在字符串中存储NULL字符(不是全部,但很多。我知道zsh可以),因此不能将其用作定界符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句