Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅解析bash中的第一个分隔符_Bash_Shell_Parsing_Delimiter - Fatal编程技术网

仅解析bash中的第一个分隔符

仅解析bash中的第一个分隔符,bash,shell,parsing,delimiter,Bash,Shell,Parsing,Delimiter,请查找下面的函数keyvalue.sh,该函数解析带有键值对的配置文件,以返回传递的参数key的值 如果该值没有任何=equals to运算符,则它可以正常工作,但如果该值包含=equals to运算符,则返回不正确的值 function getValueForKey(){ while read -r line do #echo $line key=`echo $line | cut -d = -f1` value=`echo $l

请查找下面的函数keyvalue.sh,该函数解析带有键值对的配置文件,以返回传递的参数key的值

如果该值没有任何=equals to运算符,则它可以正常工作,但如果该值包含=equals to运算符,则返回不正确的值

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"
}
此外,还可以找到以下示例执行:-

$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"                                                                                                                                                     
}$                                                                                                                                                                      
$                                                                                                                                                                       
$                                                                                                                                                                       
$                                                                                                                                                                       
$    
对于以下情况,您根本不应该使用剪切:

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

    done < "$1"
}
read将在输入分隔符=上拆分该行,如果字段多于命名变量,则会将所有剩余行分配给在本例中命名的最终变量value

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

您根本不应该为此使用剪切:

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

    done < "$1"
}
read将在输入分隔符=上拆分该行,如果字段多于命名变量,则会将所有剩余行分配给在本例中命名的最终变量value

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

是一种有效的纯shell解决方案,但此类解决方案不可避免地速度较慢,这就是为什么William建议将键排序配置文件与外观相结合

另一种不需要排序的方法是使用awk:

-F=将每一行按所有匹配项拆分为字段= 我们仍然可以使用$1(第一个字段的关键字段)将其与感兴趣的键值进行比较。 但是,为了输出相应的值,使用字符串替换来确保值按原样输出,即使它包含=实例: sub/^[^=]+=/,将从行^1开始到第一个=实例[^=]+的所有内容替换为sub,并使用空字符串匹配除^=后接=以外的非空字符序列+,只保留值。 电话示例:

$ 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"
是一种有效的纯shell解决方案,但此类解决方案不可避免地速度较慢,这就是为什么William建议将键排序配置文件与外观相结合

另一种不需要排序的方法是使用awk:

-F=将每一行按所有匹配项拆分为字段= 我们仍然可以使用$1(第一个字段的关键字段)将其与感兴趣的键值进行比较。 但是,为了输出相应的值,使用字符串替换来确保值按原样输出,即使它包含=实例: sub/^[^=]+=/,将从行^1开始到第一个=实例[^=]+的所有内容替换为sub,并使用空字符串匹配除^=后接=以外的非空字符序列+,只保留值。 电话示例:

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

请不要张贴文字图片。将其复制并粘贴为代码块。否则很难阅读,对视力受损的人来说是不可能的。@JNevill:谢谢!没有阅读部分=价值的一部分。它使您的代码与POSIX sh不兼容,但没有添加任何补偿好处。请不要发布文本图片。将其复制并粘贴为代码块。否则很难阅读,对视力受损的人来说是不可能的。@JNevill:谢谢!没有阅读部分=价值的一部分。它使您的代码与POSIX sh不兼容,但没有增加任何补偿好处。