Shell Funtion字符串变量结果为空白?

时间:2018-02-12 10:24:14

标签: bash macos shell

我有一个小脚本,它有一个询问用户输入(用户名)的功能,然后我有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

2 个答案:

答案 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返回一个值来指示成功或失败,这是最简单的