有没有办法在回显函数中返回特定值?
return
允许我返回该函数的退出状态。我需要返回更复杂的数据结构,例如数组或字符串。通常我需要回显我想要返回的值。但是,如果我需要在函数中回显信息性消息,并且只需要获取包含我需要的结果的最后一个回显,该怎么办?
我有这段代码,我想用它来创建一个函数,但我想保留信息丰富的回显,因为它们对于指导用户的输入很有用。
modules=(module1 module2 module3)
is_valid=-1
while [ $is_valid -lt 1 ]
do
echo "Please chose and order the available modules you need:"
echo -e $(list_array_choices modules[@])
echo -n "> "
read usr_input
choices=("$usr_input")
is_valid=$(is_list_in_range choices[@] ${#modules[@]})
[ "$is_valid" -eq -1 ] && echo -e "Error: your input is invalid.\n"
done
我想做类似的事情
function get_usr_choices() {
modules=${!1}
is_valid=-1
while [ $is_valid -lt 1 ]
do
echo "Please chose and order the available modules you need:"
echo -e $(list_array_choices modules[@])
echo -n "> "
read usr_input
choices=("$usr_input")
is_valid=$(is_list_in_range choices[@] ${#modules[@]})
[ "$is_valid" -eq -1 ] && echo -e "Error: your input is invalid.\n"
done
echo ${choices[@]} # This is the result I need.
}
choices=$(get_usr_choices modules[@])
唉,当我得到一个包含所有回声(包括信息丰富的回声)的字符串时,回声完全搞乱了输出。有没有办法以干净的方式做我想要的事情?
答案1
您可以将所有其他内容直接输出到屏幕,假设您除了显示之外不想对其执行任何操作。
可以做类似的事情
#!/bin/bash
function get_usr_choices() {
#put everything you only want sending to screen in this block
{
echo these
echo will
echo go
echo to
echo screen
}> /dev/tty
#Everything after the block is sent to stdout which will be picked up by the assignment below
echo result
}
choices=$(get_usr_choices)
echo "<choices is $choices>"
运行此返回
these
will
go
to
screen
<choices is result>
答案2
默认情况下,变量在 bash 中不是本地的,所以你可以这样做:
function get_usr_choices() {
modules=${!1}
is_valid=-1
while [ $is_valid -lt 1 ]
do
echo "Please chose and order the available modules you need:"
echo -e $(list_array_choices modules[@])
echo -n "> "
read usr_input
choices=("$usr_input")
is_valid=$(is_list_in_range choices[@] ${#modules[@]})
[ "$is_valid" -eq -1 ] && echo -e "Error: your input is invalid.\n"
done
}
get_usr_choices
# use choices here
唯一的问题是不要使用或 管道get_usr_choices
来调用子 shell ,否则你会丢失.$(...)
choices