1

我正在制作一个函数来轻松地将我的字符串转换为我需要的数组。

我有点遇到一个奇怪的问题。我还是 bash 的新手,这真的让我很烦。有人可以对此有所了解吗?

转换.sh

#!/bin/bash
convert2array () {
read -a $1_arr <<< $1
}

mx=$(dig +short google.com mx | cut -d' ' -f 2 | sed 's/\.$//')

convert2array "$mx"

echo ${mx_arr[@]}

输出:

bash -x convert2array.sh 
++ sed 's/\.$//'
++ cut '-d ' -f 2
++ dig +short google.com mx
+ mx='alt2.aspmx.l.google.com
alt3.aspmx.l.google.com
alt1.aspmx.l.google.com
aspmx.l.google.com
alt4.aspmx.l.google.com'
+ convert2array mx
+ read -a mx_arr
+ echo 585911
585911
4

4 回答 4

3

尝试以下操作:

convert2array () {
  # Bash v4+ alternative: `readarray -t` instead of `IFS=$'\n' read -d '' -ra`
  IFS=$'\n' read -d '' -ra "$1" <<<"$2"
}

mx=$(dig +short google.com mx | cut -d' ' -f 2 | sed 's/\.$//')

convert2array mx_arr "$mx"

printf '%s\n' "${mx_arr[@]}"

至于你尝试了什么:

  • $1insideconvert2array不是输入变量的名称$mx,而是它的
    您需要将要显式声明的变量的名称(可能在修改输入名称之后)作为单独的参数传入。

  • read默认情况下只读取输入的第一行,而您传递行。读取所有行,并将
    -d ''每一行作为一个整体读取。在 Bash v4+ 中, 使用 builtin可以替换为.readIFS=$'\n'read
    readarrayIFS=$'\n' read -d '' -rareadarray -t


您的命令的简化版本是使用 Bash v4+内置命令将dig ...输出行直接读入数组:readarray

readarray -t mx_arr < <(dig +short google.com mx | cut -d' ' -f 2 | sed 's/\.$//')

Bash v3.x 替代方案:

IFS=$'\n' read -d ''  -ra mx_arr < <(dig +short google.com mx | cut -d' ' -f 2 | sed 's/\.$//')
于 2016-12-19T04:31:59.500 回答
2

您可以直接将dig结果存储在数组中

 declare -a results=( $( dig +short google.com mx | cut -d' ' -f 2 | sed 's/\.$//' ) )
 echo "${results[@]}"

此外,您不需要cut在这里使用,sed单独使用就足够了。

declare -a results=( $( dig +short google.com mx  | sed -E 's/^[[:digit:]]*[[:blank:]]*(.*)\.$/\1/') )
echo "${results[@]}"
aspmx.l.google.com
alt1.aspmx.l.google.com
alt2.aspmx.l.google.com
alt4.aspmx.l.google.com
alt3.aspmx.l.google.com

请参阅[bash 数组][命令替换][位置参数]

警告您:输出可以是一种格式。虽然是评论#1( $( .. ) )中指出的反模式,但对于这种情况,它就足够了。

于 2016-12-19T04:19:23.783 回答
1

只需说明您的功能出了什么问题:

convert2array () {
read -a $1_arr <<< $1
}

$1在这里,当您想要读取变量本身的内容时,您正在读取 的内容,这是变量的名称。你可以在这里使用间接:

convert2array () {
  read -a $1_arr <<< ${!1}
}

正如其他人所指出的,有更简单的方法可以在数组中获取输出。

于 2016-12-19T04:46:47.587 回答
0

如果数组只是一次性的,对于只读输出循环,POSIX shell可以做到:

set -- `dig +short google.com mx` ; \
while [ "$2" ] ; do echo "${2%.*}" ; shift 2 ; done

输出:

alt2.aspmx.l.google.com
alt3.aspmx.l.google.com
alt4.aspmx.l.google.com
alt1.aspmx.l.google.com
aspmx.l.google.com

如果输出需要进一步大惊小怪,请将其echo传递给需要做的任何其他事情。


注意:上面的代码包含一个简单的 kludge 来避免sedcut-- 而是只输出偶数数组成员,并使用参数扩展Remove Smallest Suffix Pattern ”来删除那个 '.' 在最后。

于 2016-12-19T05:33:31.073 回答