仅解析 bash 中的第一个定界符

parse only first delimiter in bash

请在下面找到函数 (keyvalue.sh),该函数将具有键值对的配置文件解析为 return 传递的参数键的值。

如果值没有任何 =(等于运算符),它工作正常,但如果值包含 =(等于)运算符,它 return 是不正确的值。

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

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

    done < ""
}

请在下面找到示例键值配置文件 (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 [ "" == "$key" ]; then                                                                                                                             
                        echo $value                                                                                                                                     
                fi;                                                                                                                                                     

        done < ""                                                                                                                                                     
}$                                                                                                                                                                      
$                                                                                                                                                                       
$                                                                                                                                                                       
$                                                                                                                                                                       
$    

您根本不应该为此使用 cut

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

    done < ""
}

read 将在输入分隔符 = 上拆分行,如果字段多于命名变量,它将所有剩余行分配给最终命名变量(在本例中, value).

但你真的应该改变你的格式。至少,对输入进行排序并使用 look 来查找值。

是一个有效的纯shell解决方案,但是这样的解决方案不可避免地很慢,这就是为什么William推荐一个键排序的配置文件结合look.

不需要排序的替代方法是使用 awk:

getValueForKey() {
  awk -F= -v key="" ' == key { sub(/^[^=]+=/, ""); print }' ""
}
  • -F= 通过 all=
  • 将每一行拆分为字段
  • 我们仍然可以使用第一个字段(关键字段)</code>,将其与感兴趣的关键值进行比较。</li> <li>然而,为了输出相应的值,使用字符串替换来确保该值按原样输出,即使它包含 <code>= 个实例:
    • sub(/^[^=]+=/, "") 替换 (sub()) 从行首 (^) 到 first =实例([^=]+匹配一个非空序列(+)字符除了^=后跟[=​​15 =]) 为空字符串,只留下值。

示例调用:

$ 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"