如何避免bash中的黑盒功能输出?

时间:2013-08-18 05:31:33

标签: bash

如果我有一个完全由函数组成的bash脚本,如何在终端中显示提示等内容?例如,请考虑以下事项:

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

main() {
  prompt
}

main "$@"

如何在终端中显示该提示信息?当我从main()调用prompt()时,它会将整个prompt()函数设置为黑盒子。我是否必须从prompt()返回一些内容?如果我想在读取提示符()后回显一堆消息怎么办?如何让这些出现在终端?

我想我在这里错过了一个基本的编程概念。

5 个答案:

答案 0 :(得分:1)

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

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

prompt

如果您想将main作为一个函数保留,那么您必须获取该文件,然后调用main。

$ source file.sh
$ main

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

答案 1 :(得分:1)

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

read的默认变量是$ REPLY,除非你提供自己的变量,所以:

echo $REPLY

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

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

如果你想在“main”之后做更多的事情,你可以按照你希望它们发生在主要内部(假设调用main)或调用main

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

. myfuncs.sh && main

答案 2 :(得分: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

答案 3 :(得分:0)

您输入提示而不是提示()

更好的是......

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

然后

prompt "This is an example prompt."

答案 4 :(得分: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