有谁知道如何将这个mac bash语句转换为可重用的函数?
test $var || echo -e "\n$(tput bold)Question for User$(tput sgr0)" && read var
我连续有大约30个类似的陈述,我试图让它更有效率。我认为这个函数会被这样的东西解雇:
userInput "Question for User" var
答案 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)
一些提示:
test
本身{(如果test $var
为空,则与var
相同的命令)是假的,test some_string
通常是真的(只要字符串不是&#39} ; t包含test
表达式中使用的特殊字符。tput
内容只是字符串格式化,没有其他副作用,因此可以将它们放入变量中以避免每次运行两个分叉。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
}
我读过它取决于某种参数扩展/替换,但无法真正解释这是什么或为什么会这样。