1

如果我有一个纯粹由函数组成的 bash 脚本,我如何让诸如提示之类的东西出现在终端中?例如,考虑以下情况:

prompt() {
  read -p "This is an example prompt. [Y/n]"
}

main() {
  prompt
}

main "$@"

如何让该提示消息显示在终端中?当我只是从 main() 调用 prompt() 时,它会将整个 prompt() 函数黑箱化。我必须从 prompt() 返回一些东西吗?如果我想在读入 prompt() 后回显一堆消息怎么办?如何让那些显示在终端中?

我想我在这里缺少一个基本的编程概念。

4

5 回答 5

1

回答最后一个问题1st。是的,'shell' 是线性执行的(函数必须在调用之前出现,并且只有在调用时才会执行)并且不会自动调用 main。

a 的默认变量read是 $REPLY 除非您提供自己的变量,因此:

echo $REPLY

或者

read -p "Enter data?" MYVAR; echo $MYVAR

或者

read -p "Enter data?" FIRSTVAR RESTOFSENTENCE; echo $FIRSTVAR:$RESTOFSENTENCE

如果你想在你的“main”之后做更多的事情,你可以按照你希望它们出现在 main 内部(假设 main 被调用)或调用 main 之后的顺序添加这些命令

如果你希望它们只是函数,你可以将它们保存到一个名为 myfuncs.sh 的文件中,然后从一个 shell 源中运行一个函数:

. myfuncs.sh && main

于 2013-08-18T07:20:11.673 回答
1

如果您使用该代码运行脚本,则不会执行 main。另一种方法是将 prompt() 保留为函数,并将 main() 的功能移到函数之外。

prompt() {
  read -p "This is an example prompt. [Y/n]"
}

prompt

如果您想将 main 保留为函数,则必须获取文件,然后调用 main。

$ source file.sh
$ main

其中 file.sh 是包含您的代码的文件,$ 表示终端提示符。

于 2013-08-18T05:40:35.940 回答
0

我对您的问题的理解是:
您有一组函数(bash shell 脚本),并且您希望它们将值返回给调用点。

C++ 中的示例:

char * prompt() {
    std::cout<<"Some message:";
    std::cin>>value;
    return value;
}

这种返回值在 bash(或其他 bourne 后代 shell)脚本中是不可能的。函数只有一个退出值(类似于命令),例如false命令的实现:

myfalse() { return 1; }

因此return仅设置零或非零退出状态。

要使用函数中的值,函数需要将该值放入标准输出,并通过命令替换捕获该输出。例如:

toupper() {
    val="$(echo $1| tr 'a-z' 'A-Z')"
    echo $val
}

ucasestr="$(toupper "Hello, World")"
echo $ucasestr
HELLO, WORLD
于 2013-08-19T02:38:15.940 回答
0

你输入 prompt 而不是 prompt()

更好的是...

function prompt() {
  read -p "$* [Y/n]"
}

然后

prompt "This is an example prompt."
于 2013-08-18T06:14:56.073 回答
0

你是如何执行脚本的,调用 main() 的是什么?

Bash 脚本与 C 程序不同,不需要 main() 函数。Bash 会“记住”它看到的任何函数,但实际上你需要直接从脚本中调用它们。

尝试这个:

# Start of script
prompt() {
  read -p "This is an example prompt. [Y/n]"
}

prompt
# End of script


bash$ chmod +x script_name
bash$ ./script_name
于 2013-08-18T05:39:17.987 回答