1

必要に応じて文字列を配列に簡単に変換する関数を作成しています。

私はやや奇妙な問題に直面しています。私はまだbashに慣れていないので、これは本当に私を悩ませています。誰かがこれに光を当てることができますか?

convert.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[@]}"

あなたが試したことについて:

  • $1insideは入力変数の名前convert2arrayではなく、そのです。 別の引数として、宣言する変数の名前を (おそらく入力名を変更した後に) 明示的に渡す必要があります。$mx

  • readデフォルトでは、入力の最初の行のみを読み取りますが、複数の行を渡しています。
    -d ''すべての行をread読み取り、各行をまとめ読み取ります。 Bash v4+ では、 builtin を使用して をに置き換えることができます。IFS=$'\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 arrays][command subsctitution]、および[positional parameters]を参照してください。

あなたは警告されています:出力は1つの形式である可能性があります。コメント#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

読み取り専用の出力ループの場合、配列が 1 回限りの場合は、POSIX シェルで実行できます。

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は、必要なものにパイプします。


注: 上記のコードには、回避するための簡単な手間が含まれています-- 代わりに、偶数の配列メンバーのみを出力し、sedパラメーター展開"Remove Smallest Suffix Pattern" を使用その'.' を削除します。最後に。cut

于 2016-12-19T05:33:31.073 に答える