【问题标题】:Unsetting variable doesn't work取消设置变量不起作用
【发布时间】:2017-03-23 15:07:31
【问题描述】:

我想解析用户输入是否为整数,并强制他这样做。第一次 (iquant) 运行 chkip() 有效,第二次 (idays),我立即得到:“错误:不是数字。请重试。”然后新的输入起作用。我在break 之前取消了ipn,所以有什么关系?

chkip()
{
    ipn=$1
    while true;
    do
        if [[ "$ipn" =~ ^[0-9]+$ ]] ; then 
            unset ipn
            break
        else 
            echo "Error: Not a number. Please retry"
            read ipn
        fi
    done
}

echo "Please enter the name of the Set:"
read ap
echo "How much keys do you want to create [NUMBER]:"
read iquant
chkip $iquant 
echo "How often do you want to change the Keys? [DAYS] ?:"
read idays
chkip $idayz 

【问题讨论】:

  • 您可能想要引用这些扩展("$1""$iquant" 等),并考虑 set -u 在尝试使用未设置的变量时出现错误。
  • 也许您还应该添加一个返回值,因为更正后iquant 将包含旧值,ipn 将超出范围。
  • 欢迎来到stackoverflow! +1 包括完整、独立的源代码、预期结果和实际结果。这使问题清晰、明确且易于回答和验证。

标签: bash function unset


【解决方案1】:

问题是您正在阅读“idays”但传递的是“idayz”而不是前者。

read idays
chkip $idayz

$idayz 更改为 $idays 即可。

【讨论】:

    【解决方案2】:

    你有一个更大的问题:你的函数只修改名为 ipn 的变量,而不是你作为参数传递的 value 的任何变量。

    此函数获取变量的名称,并使用间接参数扩展来检查该变量的值。 var 被传递给 read 作为要填充的变量的名称。

    chkip () {
      local var=$1
      until [[ ${!var} =~ ^[[:digit:]]$ ]]; then
        read -p "Error: Not a number. Please retry: " "$var"
      done
    }
    

    这里,变量的名称,而不是值,作为参数传递给chkip

    read -p "Please enter the name of the set: " ap
    read -p "How many keys do you want to create? [NUMBER]: " iquant
    chkip iquant 
    read -p "How often do you want to change the keys? [DAYS]: " idays
    chkip idays
    

    【讨论】:

      猜你喜欢
      • 2014-11-13
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多