2016-12-02 41 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" 
} 
相關問題