我有一个小脚本,它有一个询问用户输入(用户名)的功能,然后我有echo功能 正在运行该函数并要求输入, 之后我回显了最后一行中的$ User_name(Users_name_is - ),它在函数中设置但结果为黑色,我想在进一步的脚本中使用$ User_name。 我做错了什么?
#!/bin/sh
funtion_one()
{
read varname
if [ $varname == skull ]; then
echo "Nice to meet you $varname"
#User_name=$varname
else
echo "I dont know you $varname"
fi
User_name=$varname
}
echo Hello, who am I talking to?
while :
do
case $(funtion_one) in
"Nice to meet you skull") break
;;
"I dont know you") $(funtion_one)
;;
esac
done
echo "Users_name_is - $User_name"
我想要结果Users_name_is - skull
答案 0 :(得分:2)
执行$(funtion_one)
时,您正在子shell中执行该函数,因此在函数完成后,所创建的任何变量都将不复存在。
另一种选择是:
function_one()
{
read varname
if [ "$varname" = skull ]; then
echo "Nice to meet you $varname" >&2
else
echo "I dont know you $varname" >&2
fi
echo "$varname"
}
user_name=$(function_one)
现在user_name
存在于父shell中。消息将发送到标准错误,并且已读取的名称将发送到标准输出,以便命令替换$()
可以捕获它。
或者,您只需在父shell中执行该函数:
# change
echo $(funtion_one)
# to
funtion_one
但是,函数内部使用的所有变量在运行后都将继续存在。
似乎这个功能阻碍了你实现自己想要的目标。我会将您的代码重构为更简单的代码:
while read name; do
if [ "$name" = skull ]; then
echo "Nice to meet you $name"
break
fi
echo "I don't know you $name"
done
答案 1 :(得分:0)
有很多方法可以构建你的代码,而你似乎正在尝试做类似的事情:
(dotimes [x 10]
(.println System/out (times 10 (Thread/yield))))
=> nil
[33521 1733 1232 1161 1150 1135 1151 1138 1143 1144]
[1724 1205 1149 1152 1141 1149 1149 1150 1139 1145]
[1368 1156 1141 1139 1147 1149 1141 1147 1141 1149]
[1306 1159 1150 1141 1150 1148 1147 1142 1144 1149]
[1329 1161 1155 1144 1140 1155 1151 1149 1149 1140]
[1319 1154 1140 1143 1147 1154 1156 1149 1148 1145]
[1291 1166 1164 1149 1140 1150 1140 1152 1141 1139]
[4482 1194 1148 1150 1137 1165 1163 1154 1149 1152]
[1333 1184 1162 1163 1138 1149 1150 1151 1137 1145]
[1318 1150 1144 1150 1151 1147 1138 1147 1143 1149]
使用函数来获取输入是完全有效的,但是如果你想让函数在调用者中设置一个变量你就不能把它称为子shell,如果shell返回一个值来指示成功或失败,这是最简单的