Bash 函数为传递的参数赋值

Bash 函数为传递的参数赋值

我有以下情况:

我正在编写一个脚本,该脚本将从配置文件(如果存在且参数存在)读取其参数,或者要求用户输入所述参数(如果不存在)。

由于我正在为一些参数执行此操作,因此我认为编写一个函数是可行的方法。

然而,据我了解,该函数通过echoing 或将其分配给全局变量来返回结果值。我确实想在函数中回显屏幕,所以它必须是选项二。所以我尝试了这个:

# parameters: $1=name of parameter, $2=user prompt, $3=value read from config.cfg
function getParameter {
    # If the value couldn't be read from the config file
    if [ -z "$3" ]; then
        # Echo the prompt
        echo "$2"
        # Read the user input
        read parameter

        # If it's empty, fail
        if [ -z "$parameter" ]; then
            echo "Parameter $1 not found"
            exit
        # Else, try to assign it to $3   <---- This is where it fails
        else
            $3="$parameter"
        fi
    fi
}

我这样称呼它:

getParameter "Database username" "Please enter database username" $database_username

config.cfg文件是source在调用函数之前创建的,并且$database_username是那里的可选参数之一。

现在这显然行不通了。我无法分配给$3并且因为我希望该方法是通用的,所以我MY_VARIABLE=$parameter也不能这样做。

有谁对我如何实现以下所有目标有任何建议:

  1. 从其中获取变量值config.cfg或从用户输入中读取它
  2. 以通用方式执行此操作,即不要为每个参数重复上述代码(没有函数)

答案1

不能 100% 确定我遵循,但假设文件config如下所示:

foo
database_user tom
bar

我们想要的明显值是 的值database_user

在脚本中,您可以简单地添加这样一行:

dbUser=$(sed -nE 's/database_user (.*$)/\1/p' config)

然后变量$dbUser将包含以下信息:

echo $dbUser 
tom

答案2

好吧,看来我解决了我自己的问题:

function getParameter {
    if [ -z "$3" ]; then
        # User read -p to show a prompt rather than using echo for this
        read -p "$2`echo $'\n> '`" parameter

        # Print to sdterr and return 1 to indicate failure
        if [ -z "$parameter" ]; then
            >&2 echo "Parameter $1 not found"
            return 1
        else
            echo $parameter
        fi
    else
        echo $3
    fi
}

通过使用,echo -p我能够在控制台上显示提示,并且仍然能够使用常规echo.这样,通过调用该函数,database_username=$(getParameter ...)我可以将其分配给一个变量。

相关内容