BASH提取变量中字符串后的值 不是文件

11 浏览
0 Comments

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希望有人能给我一些启示。

0
0 Comments

问题的出现原因是需要从一个变量中提取特定字符串后面的值,而不是从文件中提取。解决方法是将变量转换为关联数组,然后根据键获取相应的值。

在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。这种方法可以帮助我们从变量中提取特定字符串后面的值,而不需要使用文件操作。

0
0 Comments

问题的原因是在代码中存在多次重复的代码,这是一个不好的编码习惯。解决方法是将相同的代码放在一个函数中,避免重复使用。

首先,将代码修改为使用一个简单的查找函数:

$ 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中正确使用引号。

0