snmpwalkを実行してネットワークインタフェースを取得しようとしていますが、配列から切り離すことはできません。変数はすべて要素0に格納されています。
ifname=(\$(snmpwalk -Oqv -v2c -c comm xxx.xxx.xxx.xxx 1.3.6.1.2.1.2.2.1.2)))
これはheredocの中にあります
どうすればいいですか?
答え1
コードはほとんど動作します。出力:
snmpwalk -Oqv -v2c -c public (somehost) 1.3.6.1.2.1.2.2.1.2
希望の出力を生成します。配列に保存するには、組み込み関数をbash
使用してください。readarray
主な注意点は、パイピングがサブシェルと環境変数を処理する方法のため、readarray
次のように入力をパイピングするのではなく、標準入力(通常はコマンド置換を介して)を具体的にリダイレクトする必要があることです。
readarray -t if_names < <(
snmpwalk -Oqv -v2c -c public (somehost) 1.3.6.1.2.1.2.2.1.2
)
for i in "${!if_names[@]}"
do
printf '%d: %s\n' "$i" "${if_names[$i]}"
done
0: public
1: vlan3
2: igb1
3: igb2
4: igb3
5: lo0
6: vm-public
7: tun0
答え2
使いたいかもしれませんsnmptable
(関連)変えるsnmpwalk
。
チュートリアルがありますここ。
答え3
あなたの例で行うことは、いくつかの修正で値を配列に設定することです。 $の前にescape \を取り出す必要があります
bash$ ifname=($(snmpwalk -Oqv -v2c -c $comm $device 1.3.6.1.2.1.2.2.1.2))
bash$ echo ${#ifname[@]} # how many elements in the array
58
bash$ echo ${ifname[0]} # item at index 0
"GigabitEthernet1/1/1"
bash$ echo ${ifname[1]} # item at index 1
"GigabitEthernet1/1/2"
bash$ echo ${ifname[5]} # item at index 5
"GigabitEthernet1/1/6"
snmpwalkの戻り値に空白がある場合、この方法は機能しない可能性があります。 IFSを使用して入力フィールド区切り文字を改行文字に制限すると便利です(この記事を参照)。スタックオーバーフロー回答この問題を解決するのに役立ったと思います。)
OLDIFS="$IFS"
IFS=$'\n' # newlines are the only separator
IN=($(my_command ...))
IFS="$OLDIFS"