bash
  • shell
  • 2017-06-23 70 views 1 likes 
    1

    我有下面的代碼閱讀:EXPR:非數字的參數,同時呼籲從另一個腳本腳本,並傳遞參數從文件

    #!/bin/bash 
    
    PROP_FILE="${HOME}/my-prop.properties" 
    
    getProperty() { 
         echo `cat ${PROP_FILE} | grep ${1} | cut -d'=' -f2` 
    } 
    
    PORT=$(getProperty "PORT") 
    HOSTS=$(getProperty "HOSTS") 
    
    #PORT=myPort 
    #HOSTS=myHosts 
    
    echo ${PORT} 
    echo ${HOSTS} 
    
    EXE="${HOME}/server/bin/my-executable.sh" 
    
    bash ${EXE} start -p ${PORT} -h ${HOSTS} 
    

    現在,當我運行這個shell腳本,它給我的錯誤:expr: non-numeric argument。如果我硬編碼的值(它顯示爲註釋代碼),它的工作原理。

    以下是my-prop.properties:

    PORT=myPort 
    HOSTS=myHosts 
    

    任何幫助將非常感激。

    回答

    1

    如果在文件中有多個這樣的鍵值對,並希望僅過濾PORTHOST做一個過程,替代如下

    #!/usr/bin/env bash 
    
    propFile="${HOME}/my-prop.properties" 
    scriptPath="${HOME}/server/bin/my-executable.sh" 
    
    while read -r port; read -r host; do 
        bash "$scriptPath" start -p "$port" -h "$host" 
    done < <(awk -F= '$1=="PORT" || $1=="HOSTS"{print $2}' "$propFile") 
    

    以下僅會的工作,如果有這兩個屬性文件中的鍵值對。

    爲什麼約的方式全面實現這樣一個簡單的任務。您可以在性能與設置上=IFS文件,只是讀取包含主機和端口值的第二個字的輸入重新方向bash做到這一點。

    #!/usr/bin/env bash 
    
    propFile="${HOME}/my-prop.properties" 
    scriptPath="${HOME}/server/bin/my-executable.sh" 
    
    while IFS== read -r _ port; IFS== read -r _ host; do 
        bash "$scriptPath" start -p "$port" -h "$host" 
    done < "$propFile" 
    

    這工作,你有屬性中的兩行文件,如假設下。如果需要,您可以在調用實際腳本之前打印主機和端口的值。

    +0

    嗨,其實我在屬性文件中的一些其他關鍵=值將被用於不同的操作,這是不是在原來的崗位展示。 –

    +1

    @TapasBose:在回答的第一部分提到我的更新 – Inian

    +0

    嗨,感謝您的及時迴應,但不幸的是,它仍然拋出同樣的錯誤,'expr:非數字參數'爲解決方案1和2 。 –

    相關問題