2016-12-02 85 views
0

我对bash并不熟悉。我有一个场景,我用一些参数调用一个函数,并将返回值赋给一个变量。使用参数调用函数而不使用子shell - 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') 
} 

的问题是检测到错误的IP时,变量“PXE-IP”分配值“无效的IP”,因为F2正在从叫subshel​​l,是否有可能使用同一个shell中的参数调用函数

+0

您不能将它PXE的IP,而在同一个shell中运行它,即使在子shell中,它的运行方式也不应该有任何区别...... – 123

+0

您可能应该将错误消息写入stderr:'echo'无效IP'>&2'(以及阅读sorontar的答案)。 –

回答

1

您可以直接调用该函数修改的变量:

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 
} 
+0

谢谢,我明白了。 – Junaid

0

你可以使用函数为F2(IP_REGEX)作为

+0

我是新的在这个门户网站我很抱歉关于我的演示文稿,但这是戈纳帮助你这个语法的任何fucktion添加属性 – yunus

+0

我编码器原因ı学习所有的事情在scholl和练习和youtubeı只知道解决方案ı没有链接你可以用这个语法得到一些东西,对不起,兄弟,感到失望stutry – yunus

1

我提出一个解决方案:

  1. 与功能参数传递工作:功能得到$ 1,$ 2个参数,...澄清分配给本地变量,并与
  2. bash函数返回工作0 OK,!= 0的错误

下一个代码是如何能(我几乎听不懂你试图做什么),但AP的roximation你正在寻找:

# 
# 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" 
} 
相关问题