![期待変数の出力を解析し、それをbashスクリプトで使用する](https://rvso.com/image/170283/%E6%9C%9F%E5%BE%85%E5%A4%89%E6%95%B0%E3%81%AE%E5%87%BA%E5%8A%9B%E3%82%92%E8%A7%A3%E6%9E%90%E3%81%97%E3%80%81%E3%81%9D%E3%82%8C%E3%82%92bash%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A7%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B.png)
私は、bash スクリプト内で expect を使用する bash スクリプトを持っています。この bash スクリプトは、スクリプトの expect 部分でパスワードを要求し、その後出力を返します。その出力を取得して解析し、出力の一部だけを表示して、通常の bash スクリプトが使用できる変数に格納したいと考えています。私のスクリプトは次のとおりです。
#!/bin/sh
output=$(
/usr/bin/expect << EOF
spawn -noecho generate passcode -a 123456789
expect "passphrase:" { send "password\n" }
expect eof
EOF
#)
) | awk '/^ [a-zA-Z]*: (\S+)/'
echo $output
awk 正規表現を使わずに得られる出力は次のとおりです。
Passcode: 543245324532455464
正規表現は出力を解析し、543245324532455464
出力変数に値のみを保存します。これが期待どおりの動作です。| awk '/^ [a-zA-Z]*: (\S+)/'
コマンドの末尾に を追加すると、何も返されず、空白だけが返されます。これを削除すると、期待どおりの出力が返されます。
bash の変数に正しいデータを保存する方法を教えてください。
答え1
書かれているように、/usr/bin/expectの出力をキャプチャし、awkに何もパイプしません。コマンド置換の閉じ括弧はパイプラインの最後に配置する必要があります。
ない
... ) | awk '/^ [a-zA-Z]*: (\S+)/'
しかし
... | awk '/^ [a-zA-Z]*: (\S+)/')
は非標準(PCRE)であり、awkのすべてのバージョンでサポートされているわけではないことに注意してください\S
。また、キャプチャグループはおそらく効果がありません。次のような方が良いかもしれません。
awk -F': ' '$1 ~ /Passcode/ {print $2}'