BASH提取变量中字符串后的值 不是文件
BASH提取变量中字符串后的值 不是文件
我发现了一个无法解决的奇怪问题。\n我需要从一个变量中提取一些值,这些值在一个字符串之后。\n在这个例子中,变量的名称是:DSLSTATE\n以下是其中一个值的示例:\nNewEnable 1\nNewStatus Up\nNewDataPath Fast\nNewUpstreamCurrRate 21598\nNewDownstreamCurrRate 170788\nNewUpstreamMaxRate 25692\nNewDownstreamMaxRate 170788\nNewUpstreamNoiseMargin 90\nNewDownstreamNoiseMargin 60\nNewUpstreamAttenuation 150\nNewDownstreamAttenuation 170\nNewATURVendor 41564d00\nNewATURCountry 0400\nNewUpstreamPower 486\nNewDownstreamPower 514\n
\n这不是一个数组。\n为了提取我想要的值,我进行了以下操作:\n
ATTUPSTREAM=$(echo "$DSLTATE" | awk '{for (I=1;I\n在这个例子中,值应该是150,但结果总是为空。\n奇怪的是,我可以使用相同的命令从同一个变量中提取所有的值,除了这个例子中的一个。\n如果我在终端上执行相同的命令,它是有效的,但在脚本中却不起作用。\n以下是脚本的一部分:\n
UPSTREAM=$(echo $DSLSTATE | awk '{for (I=1;I\n以下是结果:\n
ATTUPSTREAM= ATTDOWNSTREAM=170 SNRUPSTREAM=40 SNRDOWNSTREAM=50\n也许在DSLSTATE变量中的值之间有一些奇怪的字符?\n希望有人能给我一些启示。
问题的出现原因是需要从一个变量中提取特定字符串后面的值,而不是从文件中提取。解决方法是将变量转换为关联数组,然后根据键获取相应的值。
在Bash中,可以将变量DSLSTATE
转换为关联数组。然后,根据键可以更容易地获取对应的值。下面是解决方法的代码示例:
#!/bin/bash DSLSTATE='NewEnable 1 NewStatus Up NewDataPath Fast NewUpstreamCurrRate 21598 NewDownstreamCurrRate 170788 NewUpstreamMaxRate 25692 NewDownstreamMaxRate 170788 NewUpstreamNoiseMargin 90 NewDownstreamNoiseMargin 60 NewUpstreamAttenuation 150 NewDownstreamAttenuation 170 NewATURVendor 41564d00 NewATURCountry 0400 NewUpstreamPower 486 NewDownstreamPower 514' declare -A kv while read k v; do kv[$k]=$v done <<< $DSLSTATE echo "NewDownstreamPower: ${kv[NewDownstreamPower]}"
上述代码的输出结果为:NewDownstreamPower: 514
通过将变量DSLSTATE
转换为关联数组,我们可以根据键NewDownstreamPower
获取对应的值514。这种方法可以帮助我们从变量中提取特定字符串后面的值,而不需要使用文件操作。
问题的原因是在代码中存在多次重复的代码,这是一个不好的编码习惯。解决方法是将相同的代码放在一个函数中,避免重复使用。
首先,将代码修改为使用一个简单的查找函数:
$ tag2val() { echo "$DSLSTATE" | awk -v tag="$1" '$1==tag { print $2 }'; } $ tag2val NewDataPath Fast $ tag2val NewUpstreamAttenuation 150
如果仍然存在问题,请编辑问题以显示`echo "$DSLSTATE" | cat -Ev`的输出。
问题可能出现在`echo`命令将变量值作为一行处理,而不是多行处理。可能的原因是变量中没有换行符,或者更有可能是在`echo "$DSLSTATE"`中去除了双引号,因此shell会将`$DSLSTATE`中的每个非空字符串作为单独的参数传递给`echo`,而不是作为一个单独的参数。理解shell中的引号非常重要,可以参考[mywiki.wooledge.org/Quotes](https://mywiki.wooledge.org/Quotes)。
总结一下,问题的原因是代码中存在多次重复的代码,解决方法是将相同的代码放在一个函数中。另外,需要注意在shell中正确使用引号。