Linux 不使用subshell-bash调用带有参数的函数

Linux 不使用subshell-bash调用带有参数的函数,linux,bash,Linux,Bash,我对bash不太熟悉。我有一个场景,我调用一个带有几个参数的函数,并将返回值赋给一个变量 下面是一个示例代码: function f1() { if [[ $1 =~ $IP_REGEX ]] then return 0 else echo 'Invalid IP' exit 1 end } function f2() { # read ip from json file using jq local config=<read config

我对bash不太熟悉。我有一个场景,我调用一个带有几个参数的函数,并将返回值赋给一个变量

下面是一个示例代码:

function f1() {
  if [[ $1 =~ $IP_REGEX ]]
  then
    return 0
  else
    echo 'Invalid IP'
    exit 1
  end
}

function f2() {
  # read ip from json file using jq
  local config=<read config>
  # validate ip by calling f1 if second argument passed to f2 is 'ip'
  [[ $2 == "ip" ]] && f1 $config
  echo $config
}

function read_all_configs() {
  pxe-ip=$(f2 'pxe-ip' 'ip')
}
函数f1(){
如果[[$1=~$IP\u REGEX]]
然后
返回0
其他的
回显“无效IP”
出口1
结束
}
函数f2(){
#使用jq从json文件读取ip
本地配置=
#如果传递给f2的第二个参数为“ip”,则通过调用f1验证ip
[$2==“ip”]&&f1$config
echo$config
}
函数读取所有配置(){
pxe ip=$(f2'pxe ip''ip')
}

问题是,当检测到错误的IP时,变量“pxe IP”被赋值为“Invalid IP”,因为正在从子shell调用f2,是否可以使用同一shell中的参数调用函数?

可以将函数用作f2(IP_REGEX)作为一个

我建议下一个解决方案:

  • 使用传递参数的函数:函数从$1、$2、,。。。要澄清分配给局部变量并使用该变量
  • Bash函数返回0 Ok=0错误
  • 下一个代码是“如何可以”(我几乎不理解您试图做什么),但它是对您正在寻找的内容的近似:

    # 
    # f(IP_to_check)
    # return true | false
    function f1(){
        local IP_TO_CHECK="$1"
    
       if [[ "$IP_TO_CHECK"=~ "$IP_REGEX" ]]
      then
        return 0
      else
        echo 'Invalid IP'
        return 1
      end
    }
    
    function f2() {
      # read ip from json file using jq
      # validate ip by calling f1 if second argument is 'ip'
      # f1 <ip>
      local MY_FIRST_PARM="$1"
      local MY_SECOND_PARAM="$2"
      if [ "$MY_SECOND_PARAM" == "ip" ]; then
          # do whatever
          # call your function f1
          f1 $PXE_IP 
          # If not OK-> IP invalid
          if [ $? -eq 0 ] ; then
               export PXE_IP="IP Invalid"
          fi
      fi
    }
    
    function read_all_configs() {
      f2 'pxe-ip' 'ip' 
      # After call f2 if IP is invalid global Var PXE_IP="IP Invalid"
    }
    
    #
    #f(IP到IP检查)
    #返回true | false
    函数f1(){
    本地IP_TO_CHECK=“$1”
    如果[“$IP_TO_CHECK”=~“$IP_REGEX”]]
    然后
    返回0
    其他的
    回显“无效IP”
    返回1
    结束
    }
    函数f2(){
    #使用jq从json文件读取ip
    #如果第二个参数为“ip”,则通过调用f1验证ip
    #f1
    本地MY_FIRST_PARM=“$1”
    本地MY_SECOND_参数=“$2”
    如果[“$MY_SECOND_PARAM”==“ip”];则
    #做任何事
    #调用函数f1
    f1$PXE_IP
    #如果不正常->IP无效
    如果[$?-eq 0];则
    导出PXE_IP=“IP无效”
    fi
    fi
    }
    函数读取所有配置(){
    f2“pxe ip”“ip”
    #调用f2后,如果IP无效,则全局变量PXE_IP=“IP无效”
    }
    
    您可以调用函数来修改变量:

    f1() { if [[ $1 =~ $IP_REGEX ]]; then
               pxe_ip=ip
               return 0
           else
               pxe_ip='Invalid IP'
               return 1
           fi
    }
    
    function read_all_configs() {
        if f1 'ip'; then
            # do what is needed with a valid value of ip
            echo "$pxe_ip"
        else
            # do what is needed with an invalid ip.
            echo "$pxe_ip"
        fi
    }
    

    在同一个shell中运行pxe ip时,您不能将其分配给pxe ip,即使在子shell中,其运行方式也不会有任何差异……您可能应该将错误消息写入stderr:
    echo'Invalid ip'>&2
    (以及阅读sorontar的答案)。谢谢,我明白了。我是这个门户网站的新手,我很抱歉我的演示,但这是gona,可以帮助你添加属性的语法。我是程序员,因为我在scholl学习所有东西,练习和youtube。我只是知道解决方案。没有链接,你可以用这个语法得到一些东西,对不起,兄弟,我不同意