如何编写一个将用户输入保存到新变量名称的bash函数

时间:2018-04-08 23:29:27

标签: bash shell terminal

有谁知道如何将这个mac bash语句转换为可重用的函数?
test $var || echo -e "\n$(tput bold)Question for User$(tput sgr0)" && read var

我连续有大约30个类似的陈述,我试图让它更有效率。我认为这个函数会被这样的东西解雇:
userInput "Question for User" var

3 个答案:

答案 0 :(得分:2)

如果您的脚本在bash(不是zsh或dash或...)下运行,则可以执行以下操作:

newline=$'\n'
tput_bold=$(tput bold)
tput_sgr0=$(tput sgr0)
userInput() {
    if [[ -z "${!2}" ]]; then
        read -p "${newline}${tput_bold}$1${tput_sgr0}" $2
    fi
}

userInput "Question for User" var

注意:这里的关键技巧是使用${! }进行间接变量引用 - !使其基本上取消引用两次,因此2 - > var - > $var的值。此外,echo -e不可靠;根据各种因素,它可能会解释字符串中的转义字符,或者它可能会打印" -e"作为输出的一部分。 bash' read -p(提示)选项要好得多。最后,正如@ l0b0建议的那样,我只运行了tput命令两次并将结果放入变量(以及换行符,因为我没有使用echo -e)。

答案 1 :(得分:1)

一些提示:

  • Use More Quotes™test本身{(如果test $var为空,则与var相同的命令)是假的,test some_string通常是真的(只要字符串不是&#39} ; t包含test表达式中使用的特殊字符。
  • tput内容只是字符串格式化,没有其他副作用,因此可以将它们放入变量中以避免每次运行两个分叉。
  • You cannot pass the variable name to a function and have read populate it.您最好printf在函数中使用用户响应并在调用者中捕获字符串。
  • 如果可用,请使用read&#39 {s} -p选项。

答案 2 :(得分:0)

我终于设法拼凑了这个功能,这正是我正在尝试做的事情:

IComparer

此函数测试变量是否具有值。如果没有,则它从用户捕获该信息并设置变量值。以下是一些例子。

如果未设置$ name,则此命令将捕获并设置它:

public class MiddleNameComparer : IComparer<Customer>
{
    public int Compare(Customer x, Customer y)
    {
        return x.Middle.CompareTo(y.Middle);
    }
}

如果已设置$ name,则运行此函数将不执行任何操作。

userInput () {
    if [[ ${!2} == "" ]]; then
        echo -e "\n$(tput bold)$1$(tput sgr0)" && read newinput
        printf -v $2 "$newinput"
    fi
}

我读过它取决于某种参数扩展/替换,但无法真正解释这是什么或为什么会这样。