質問: xmlを解析してbashスクリプトのノード値を取得しますか? 次のパスを使用してノードの値を取得する方法を知りたいです。config/global/resources/default_setup/connection/host config/global/resources/default_setup/connection/username config/global/resources/default_setup/connection/password config/global/resources/default_setup/connection/dbname 次のxmlから:<?xml version="1.0"?> <config> <global> <install> <date><![cdata[tue, 11 dec 2012 12:31:25 +0000]]></date> </install> <crypt> <key><![cdata[70e75d7969b900b696785f2f81ecb430]]></key> </crypt> <disable_local_modules>false</disable_local_modules> <resources> <db> <table_prefix><![cdata[]]></table_prefix> </db> <default_setup> <connection> <host><![cdata[localhost]]></host> <username><![cdata[root]]></username> <password><![cdata[pass123]]></password> <dbname><![cdata[testdb]]></dbname> <initstatements><![cdata[set names utf8]]></initstatements> <model><![cdata[mysql4]]></model> <type><![cdata[pdo_mysql]]></type> <pdotype><![cdata[]]></pdotype> <active>1</active> </connection> </default_setup> </resources> <session_save><![cdata[files]]></session_save> </global> <admin> <routers> <adminhtml> <args> <frontname><![cdata[admin]]></frontname> </args> </adminhtml> </routers> </admin> </config> また、その値を変数に割り当てて、後で使用できるようにします。あなたのアイデアを教えてください。
回答: 純粋なbash関数。適切なものをインストールすることが許可されていないという不幸な場合のために。これは、より複雑なxmlでは失敗する可能性があり、おそらく失敗します。function xmlpath() { local expr="${1//\// }" local path=() local chunk tag data while ifs='' read -r -d '<' chunk; do ifs='>' read -r tag data <<< "$chunk" case "$tag" in '?'*) ;; '!–-'*) ;; '![cdata['*) data="${tag:8:${#tag}-10}" ;; ?*'/') ;; '/'?*) unset path[${#path[@]}-1] ;; ?*) path+=("$tag") ;; esac [[ "${path[@]}" == "$expr" ]] && echo "$data" done } 使用法:bash-4.1$ xmlpath 'config/global/resources/default_setup/connection/host' < magepsycho.xml localhost 既知の問題点: スロー タグ名のみで検索 文字エンティティのデコードなし