我一直致力于我们的介绍脚本编写,并且在调用脚本中的函数时遇到了问题。我在作业的第二部分,我只是在测试,以确保我所拥有的(希望)能够发挥作用。我收集了一些目录,并询问是或否。当我得到'y'时,我写了一个我调用的小函数,当我得到一个'n'时,我有另一个函数,两个简单的回声。有什么问题?
part_two(){
answer=""
for value in "$@";do
echo "$value"
while [ "$answer" != "y" -a "$answer" != "n" ]
do
echo -n "Would you like to save the results to a file? (y/n): "
read answer
done
if [ "$answer" = "n" ]
then
part_six
elif [ "$answer" = "y" ]
then
part_five
fi
done
}
part_two $@
part_five(){
echo -n "working yes";
}
part_six(){
echo -n "working no";
}
任何帮助都将一如既往地受到高度赞赏。
答案 0 :(得分:9)
与C类似,必须在使用之前定义函数。在您的代码片段中,您在声明这两个函数之前调用part_two(调用part_five和part_six)。
您是否尝试将其定义移至脚本的开头?
编辑:
在大多数情况下,在Bash中处理此问题的最佳方法是在执行任何实际命令之前简单地在脚本开头定义所有函数。定义的顺序并不重要 - shell只会在它即将使用它时查找一个函数 - 所以通常没有依赖性问题等你可能需要考虑。
编辑2:
是的情况,您可能无法在脚本开头定义函数。一种常见的情况是当您使用条件结构来动态选择或修改函数e..g。:
的声明时if [[ "$1" = 0 ]]; then
function show() {
echo Zero
}
else
function show() {
echo Not-zero
}
fi
在这些情况下你必须确保在声明该函数(以及它调用的任何其他函数)之后发生每个函数调用。
编辑3:
在bash中,函数声明实际上是您定义其实现的function foo() { ... }
块 - 是的,function
关键字并不是绝对必要的。没有像C中那样的函数原型 - 无论如何它们都没有意义,因为shell脚本通常在执行时被解析。较新的Bash版本会立即读取脚本,但它们主要检查语法错误,而不是检查此错误的逻辑错误。
BTW官方术语是“函数声明”,但即使是Bash信息页面也可以互换使用“声明”和“定义”。