2017-05-25 31 views
1

請查找以下函數(keyvalue.sh),該函數使用鍵值對分析配置文件以返回傳遞的參數鍵的值。僅在bash中解析第一個分隔符

它工作正常,如果該值沒有任何=(等於運算符),但如果該值包含=(等於)運算符,則返回不正確的值。

function getValueForKey(){ 
    while read -r line 
    do 
     #echo $line 
     key=`echo $line | cut -d = -f1` 
     value=`echo $line | cut -d = -f2` 

     if [ "$2" == "$key" ]; then 
      echo $value 
     fi; 

    done < "$1" 
} 

請在下面找到樣本鍵值配置文件(keys.txt): -

Scala_Url="http://downloads.lightbend.com/scala/2.11.8/scala-2.11.8.tgz" 
Zookeeper_Url="http://www-eu.apache.org/dist/zookeeper/stable/zookeeper-3.4.10.tar.gz" 
Eclipse_Url="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/neon/3/eclipse-jee-neon-3-win32-x86_64.zip&mirror_id=1135" 

另外,發現樣品執行如下: -

$ls                                          
keys.txt keyvalue.sh                                     
$                                          
$                                          
$                                          
$cat keys.txt                                       
Scala_Url="http://downloads.lightbend.com/scala/2.11.8/scala-2.11.8.tgz"                         
Zookeeper_Url="http://www-eu.apache.org/dist/zookeeper/stable/zookeeper-3.4.10.tar.gz"                     
Eclipse_Url="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/neon/3/eclipse-jee-neon-3-win32-x86_64.zip&mirror_id=1135"    
$                                          
$                                          
$. keyvalue.sh                                          
$                                          
$getValueForKey keys.txt "Scala_Url"                                  
"http://downloads.lightbend.com/scala/2.11.8/scala-2.11.8.tgz"                           
$                                          
$                                          
$                                          
$                                          
$getValueForKey keys.txt "Zookeeper_Url"                                 
"http://www-eu.apache.org/dist/zookeeper/stable/zookeeper-3.4.10.tar.gz"                         
$                                          
$                                          
$                                          
$                                          
$                                          
$                                          
$getValueForKey keys.txt "Eclipse_Url"                                 
"http://www.eclipse.org/downloads/download.php?file                              
$                                          
$                                          
$                                          
$                                          
$                                          
$cat keyvalue.sh                                       
function getValueForKey(){                                    
     while read -r line                                    
     do                                        
       #echo $line                                    
       key=`echo $line | cut -d = -f1`                               
       value=`echo $line | cut -d = -f2`                              

       if [ "$2" == "$key" ]; then                                
         echo $value                                  
       fi;                                      

     done < "$1"                                      
}$                                          
$                                          
$                                          
$                                          
$  
+0

請不要張貼文字的照片。複製並粘貼它作爲代碼塊在這裏。這是非常難以閱讀的,對於視力受損的人來說是不可能的。 – JNevill

+0

@JNevill:謝謝!沒有讀取'='是值的一部分的部分。 – Inian

+1

@mogli,...順便說一句,考慮嘗試擺脫使用'function'關鍵字的習慣。它使您的代碼與POSIX sh不兼容,但不會增加補償收益。 –

回答

4

你不應該」 t完全使用cut

getValueForKey(){ 
    while IFS== read -r key value; 
    do 
     if [ "$2" = "$key" ]; then 
      echo "$value" 
     fi; 

    done < "$1" 
} 

read將在輸入分隔符=上拆分該行,並且如果字段數多於命名變量,則將所有剩餘行分配給名爲的最終變量(在此例中爲value)。

但是你真的應該改變你的格式。至少,對輸入進行排序並使用look來查找值。

0

William Pursell's helpful answer是一個有效的純殼解決方案,但這樣的解決方案不可避免地會很慢,這就是爲什麼William建議將密鑰排序配置文件與look相結合的原因。

不需要排序另一種方法是使用awk

getValueForKey() { 
    awk -F= -v key="$2" '$1 == key { sub(/^[^=]+=/, ""); print }' "$1" 
} 
  • -F=將每個行成田由所有出現=
  • 我們仍然可以使用$1,第1字段(關鍵字段),將其與感興趣的關鍵值進行比較。
  • 要輸出的相應的值,但是,一個字符串替換用於確保該值原樣輸出,即使它包含=實例:
    • sub(/^[^=]+=/, "")內容替換(sub())一切從的開始線(^)到第一=實例([^=]+匹配字符^=其他的非空子序列(+),隨後=)與空字符串,只留下VA略。

樣品電話:

$ getValueForKey keys.txt 'Eclipse_Url' 
"http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/neon/3/eclipse-jee-neon-3-win32-x86_64.zip&mirror_id=1135"