linux - bash 没有 $(函数参数) 的参数

标签 linux bash shell ubuntu devops

我想创建一个多次使用基本(提示和确认)函数的脚本,当我尝试将返回值设置为任何变量时,该函数忽略参数

function promp() {
    echo $*
    read response
    echo $response
}
function confirm() {
    echo $*
    read -rp $'(y/N) : ' -ei $'N' key;
    case "$key" in
        [yY][eE][sS]|[yY])
            echo true
            ;;
        *)
            echo false
            ;;
    esac
}

IS_RESPONSE=$(confirm "SOME QUESTION")
STRING_RESPONSE=$(promp "WRITE SOMETHING")
echo $IS_RESPONSE
echo $STRING_RESPONSE

预期:

SOME QUESTION
(y/N) : N
WRITE SOMETHING 
#<< "some text"
false
some text

获得:

(y/N) : N
#<< "some text"
SOME QUESTION false
WRITE SOMETHING some text

我知道问题是函数内的回显是可变数据的一部分,但我想打印出来。

我该怎么做或者哪种方法最好

最佳答案

您的函数在 command substitution 的上下文中被调用:

STRING_RESPONSE=$(promp "WRITE SOMETHING")

因此 promp "WRITE SOMETHING" 命令的标准输出附加到变量赋值的上下文中。

但是,标准错误仍然附加到终端。如果您将 echo 的输出重定向到文件描述符 2,那么当 echo 被调用时,输出将显示给用户,例如:

function promp() {
    echo >&2 "$*"
    read response
    echo "$response"
}

另一种方法是使用-p 选项:read -p "Your prompt: " which prints the prompt string to the standard error

关于linux - bash 没有 $(函数参数) 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44443469/

相关文章:

linux - 在 shell 中集成内置更新功能,以便在有可用时接收 OTA 更新

linux - 运行从网络 curl 的 bash 脚本

windows - 从上下文菜单中删除 "Bash Prompt Here"

git - Hook /接收后 : Syntax error: "(" unexpected (expecting "done")

shell - 可以在 shell 脚本中对变量进行 urlencode 吗?

linux - Bash 脚本将带有空格分隔标记的字符串转换为数组

python - 安装 python3 后,我无法在 ubuntu 16.04 上打开终端

Linux ioport.h 和 memblock.h 头文件丢失

database - Oracle SID 和服务名称;连接问题

Bash:将 TAB 补全作为列表获取