【问题标题】:How to assign value to parameters of a function in shell script如何在shell脚本中为函数的参数赋值
【发布时间】:2017-07-04 04:43:47
【问题描述】:

我对 shell 很陌生。我需要从 shell 函数返回多个值,这就是为什么我将参数作为参数发送给函数,就像我们在 C 等编程语言中使用指针所做的那样。 我正在调用这样的函数

splitDate $date day month year

这里的日月和年是我要存储值的变量。 我的函数定义是这样的

splitDate(){
    export IFS="/"
    declare -a var
    index=0
    for word in $1; do
        var[ $index ]=$word

        ((index++))
    done

    $2=${var[0]}
    $3=${var[1]}
}

当我运行它时,我收到此错误“day=theValueIWant: command not found”&“month=theValueIWant: command not found” 这里有什么问题? 测试用例:如果我提供 04/05/2017 作为日期 我希望日存储 04,月存储 05,年存储 2017

【问题讨论】:

  • 您能否提供一个具有实际值的可验证示例?输入和预期输出?
  • 你确定这就是你想要的吗?将输出打印为一系列标记,以便您可以使用set -- 将其捕获到变量中,或者任何可能更适合外壳整体设计的变量。

标签: bash shell


【解决方案1】:

您可以使用readread 的参数是要填充的变量的名称,可以通过参数扩展以及硬编码来生成。

splitDate(){
    if [[ $1 != ??/??/???? ]]; then
        printf '%s\n' "Date not in dd/mm/yyyy format" >&2
        return 1
    fi
    IFS=/ read -r "$2" "$3" "$4" <<< "$1"
}

这就提出了一个问题,你真的需要一个单独的函数吗?

# splitDate "$currentDate" day month year
#         vs
# IFS=/ read -r day month year <<< "$currentDate"

【讨论】:

  • ++ 再次展示了简单性。如果我将$1 拆分为带有/ 分隔符的数组并尝试使用declare 而不使用eval 从数组中定义其他参数值,这是否可能?
  • 你可以;我打算发布类似IFS=/ read -a var &lt;&lt;&lt; "$1"; declare "$2=${var[0]}"; # etcprintf -v "$2" '%s' "${var[0]}" 的内容,直到我意识到read 做不到的事情都没有。
  • 正在尝试与 splitDate(){ local dateValues=( ${1//-/ } ) declare "$2=${dateValues[0]}" declare "$3=${dateValues[1]}" declare "$4=${dateValues[2]}" } 相同的函数并将其称为 splitDate "$(date +"%d-%m-%Y")" day month year 但无法使其工作。可能是我在这里遗漏了什么。
  • @chepner 感谢您的建议。这行得通!我不明白它在做什么。您能否扩展它以处理边缘情况,例如日期为 04/05/2012 但用户输入为 0 4/05/2012。
  • 这不是极端情况;那是您的用户没有正确使用该功能。
猜你喜欢
  • 1970-01-01
  • 2019-03-07
  • 2018-08-08
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多