仅解析 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"
请在下面找到函数 (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
来查找值。
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"