【问题标题】:store comma separated key=value pair in a string to $key, $value variable in shell将字符串中的逗号分隔键=值对存储到 shell 中的 $key、$value 变量
【发布时间】:2018-01-12 00:36:53
【问题描述】:

在我的 bash shell 脚本中,我有一个以逗号分隔的键、值对,采用单个字符串的形式。如何将每个键和值解析并存储在单独的变量中。
例如,
string1="key1=value1,key2=value2"

我想将这个转换为,
echo 'key1 = value1' >> key1.txt echo 'key2 = value2' >> key2.txt
string1 中的键、值对将是动态的。如何在 shell 脚本中执行此操作?
我使用 cut 来获取键和值。但我不确定如何在字符串中的对数上循环。

string1='key1=value1'
KEY=$(echo $string1 | cut -f1 -d=)
VALUE=$(echo $string1 | cut -f2 -d=)

【问题讨论】:

  • 请指定哪个shell;有很多,彼此非常不同。此外,请始终尝试在您迄今为止尝试过的代码中包含一个 sn-p 代码。
  • 添加我使用过的代码。顺便说一句,我正在使用 bash shell

标签: bash dictionary


【解决方案1】:
#!/bin/bash

string1="key1=value1,key2=value2"

while read -d, -r pair; do
  IFS='=' read -r key val <<<"$pair"
  echo "$key = $val"
done <<<"$string1,"

注意"$string1," 中的尾随,,这可确保read 也进入while 循环体,并带有最后一个 , 分隔标记。支持>

产量:

key1 = value1
key2 = value2

要将键值对写入顺序编号的文件(key&lt;n&gt;.txt,以1 开头):

#!/bin/bash

string1="key1=value1,key2=value2"

i=0
while read -d, -r pair; do
  IFS='=' read -r key val <<<"$pair"
  echo "$key = $val" > "key$((++i)).txt"
done <<<"$string1,"

【讨论】:

  • @Naresh,在 bash >= 4 中,如果您需要稍后在代码中使用键/值对,您还可以将值加载到 关联数组 (例如declare -A pairs,然后在循环中您可以简单地执行pairs[$key]="$val" 来构建pairs 数组)
【解决方案2】:

假设你在谈论 bash,这样的事情可以工作:

#!/bin/bash

string1="key1=value1,key2=value2"
OIFS="$IFS"
IFS=","

for pair in ${string1}
do
        declare $pair
done

IFS="$OIFS"

echo $key1
echo $key2

【讨论】:

  • 感谢大卫的回复。在我的逻辑中,我不会知道字符串本身的内容。它将是动态的。在那种情况下,我该如何解析我的字符串。我已按照您的要求更新了问题。
  • 依赖未引用的扩展是非常不幸的。这不仅消除了 IFS 中字符之间的区别(当 IFS 处于其默认值时,将制表符作为空格或将空格组作为单个空格发出),它还导致 glob 被扩展(因此一行仅包含 *将有一个完全依赖于本地文件名的操作)。
猜你喜欢
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 2016-12-18
  • 1970-01-01
  • 2012-08-12
  • 2013-05-08
相关资源
最近更新 更多