うたカモ技術ブログ

Linux OpenWrt

OpenWrt   UCIコマンドの使い方

post:     update: 

この記事では、UCIコンフィグレーションファイルを操作するためのUCIコマンドの使い方について紹介します。

主な内容はOpenWrt公式ドキュメントでも紹介されていますので、その補足としてお読みください。

ここでは、まずUCIコンフィグレーションファイルの構造を説明してから各UCIコマンドの詳細な使い方を紹介します。

なお、UCIコンフィグレーションファイルを管理するUCIシステムの全体的な理解については 第3回 OpenWrt開発入門 UCIコマンドによるネットワーク・Wi-Fi設定 ― UCIシステムの仕組みを参照して下さい。

それでは、行きます。

目次

  1. UCIコンフィグレーションファイルの構造理解
  2. パラメーター表記
  3. 名前付きセクションと匿名セクション
  4. 実はあまり違いがない名前付きと匿名セクション
  5. UCIコマンド一覧
  6. showコマンド
  7. setコマンド
  8. deleteコマンド
  9. commitコマンド
  10. addコマンド
  11. revertコマンド
  12. getコマンド
  13. add_listコマンド
  14. del_listコマンド
  15. renameコマンド
  16. reorderコマンド
  17. exportコマンド
  18. importコマンド
  19. changesコマンド
  20. batchコマンド
  21. 関連記事

UCIコンフィグレーションファイルの構造理解

UCIコンフィグレーションファイルには、以下の3つの構成要素が存在します。

  1. UCIコンフィグレーションファイル<config>
  2. セクション<section>
  3. オプションとリスト<option/list>

それぞれの構成要素が持つ役割について説明します。

UCIコンフィグレーションファイル<Config>
UCIコンフィグレーションファイルは、通常は /etc/config ディレクトリに格納されるファイルです。 これらのファイルは、ネットワークやWi-Fi、SSHなどの関連する設定をまとめて管理するために使用されます。 UCI構文形式の "package <file-name>" に由来して、シェルスクリプトやプログラム上ではこれらのファイルをパッケージと呼ぶことがあります。
セクション<section>
セクションは、UCIコンフィグレーションファイルに内包されるデータグループです。
例えば、ネットワークのLAN設定などのように、関連する設定の大きなまとまりであるUCIコンフィグレーションファイルが持つ、 より細かいまとまりをセクションとして管理します。
セクションには、タイプ情報が含まれており、アプリケーションはこれを利用して、 そのセクションが何に対する設定グループであるかを認識します。たとえば、networkコンフィグレーションファイルのlanセクション (network.lan)のタイプはinterfaceであり、このパラメーターを読み取るnetifdは、このlanセクションをNICに関する設定だと認識します。 ただし、実際にLAN側のNICに関する設定なのかは、lanセクション内の情報次第です。
オプションとリスト<option/list>
オプションとリストはセクションに内包されるパラメーターそのものです。
オプションは単一データ、リストは複数のデータを指します。
オプション、リストで管理される値は文字列です。
そのため、シングルクォーテーションで囲まれて表現されます。
なお、UCIコンフィグレーションファイルを読み込むOpenWrtアプリケーションは、 これらのデータが持つ特定文字列('0','1','false','true'など)を論理値として解釈する場合があります。 このことはシェルスクリプト、Luaスクリプト用UCI操作関数のconfig_get_boolget_boolを見ることでも分かります。
オプションとリストはそれぞれ以下のような特徴を持ちます。
オプション
  • ・セクション内に設定する単一のデータ
  • ・一意の名前を持ち、他のオプションと区別される
  • (例: ネットワークのLAN設定におけるIPアドレスやネットマスク
リスト
  • ・セクション内に設定する複数のデータ
  • ・同じ名前を複数持つことができ、各要素はインデックスで識別される
  • (例: ネットワークのNTPサーバーリスト

パラメーター表記

UCIコンフィグレーションファイルでは、2つのパラメータ表記方法としてHuman-friendly表記とProgrammable表記があります。

Human-friendly表記
人間が読みやすいようにインデントやタブによって整えられた表記法です。 FLASH領域(/etc/config)内のUCIコンフィグレーションファイルはすべてHuman-friendly形式で表現されます。 そのため、通常はcatコマンドを使用して、Human-friendly形式のパラメータを見ることができます。
root@OpenWrt:~# cat /etc/config/dropbear
config dropbear
    option PasswordAuth 'on'
    option RootPasswordAuth 'on'
    option Port '22'
Programmable表記
プログラム上で扱いやすいように各構成要素をドット区切りで表現した表記法です。 これにより、プログラム内の実行コード上でUCIコマンドの引数として指定することができます。 ステージング領域(/tmp/.uci)内のUCIコンフィグレーションファイルはすべてProgrammable形式で表現されます。 また、uci showコマンドの表示結果もProgrammable形式で表示されます。
root@OpenWrt:~# uci show dropbear
dropbear.@dropbear[0]=dropbear
dropbear.@dropbear[0].PasswordAuth='on'
dropbear.@dropbear[0].RootPasswordAuth='on'
dropbear.@dropbear[0].Port='22'

名前付きセクションと匿名セクション

前々節で紹介したセクションには、名前付きセクションと匿名セクションの2つが存在します。

名前付きセクション
その名の通り、名前を付けられたセクションです。
ネットワークのUCIコンフィグレーションファイル(network)を例に出せば、lanセクションやloopbackセクションが名前付きセクションです。
catコマンドによるHuman-friendly表記では、セクション定義にはセクション名とタイプ名が表示されます。
Human-friendly表記
root@OpenWrt:~# cat /etc/config/network
config interface 'loopback'  <--セクション名はloopbackです
    option device 'lo'
    option proto 'static'
    option ipaddr '127.0.0.1'
    option netmask '255.0.0.0'
.....省略

config interface 'lan'  <--セクション名はlanです
    option proto 'static'
    option netmask '255.255.255.0'
    option ip6assign '60'
    option device 'wlan0'
    option ipaddr '192.168.2.1'
.....省略
uci showコマンドによるProgrammable表記では、<config>.<section>=<section-type>で表示されます。
Programmable表記
root@OpenWrt:~# uci show network.loopback
network.loopback=interface  <--セクション名はloopbackです
network.loopback.device='lo'
network.loopback.proto='static'
network.loopback.ipaddr='127.0.0.1'
network.loopback.netmask='255.0.0.0'
root@OpenWrt:~# uci show network.lan
network.lan=interface  <--セクション名はlanです
network.lan.proto='static'
network.lan.netmask='255.255.255.0'
network.lan.ip6assign='60'
network.lan.device='wlan0'
network.lan.ipaddr='192.168.2.1'
匿名セクション
無名のセクションです。
Human-friendry形式では匿名セクションは表示されませんが、Programmable形式で表示させた場合は仮の名前「@+タイプ名+インデックス」が付けられます。 また、匿名セクションを「@+タイプ名+インデックス」で指定してshowコマンドを実行すると「cfg+uid」形式で表示されます。
catコマンドによるHuman-friendly表記では、匿名セクションは何も表示されません。
Human-friendly表記
root@OpenWrt:~# cat /etc/config/network
.....省略 config device <--匿名セクションは何も表示されません option name 'br-lan' option type 'bridge' list ports 'eth0' .....省略
uci showコマンドによるProgrammable表記では、匿名セクションは便宜上の名前である「@+タイプ名+インデックス」で表示されます。
Programmable表記その1
root@OpenWrt:~# uci show network
.....省略
network.@device[0]=device  <--匿名セクションは「@+タイプ名+インデックス」の仮の名前を与えられます
network.@device[0].name='br-lan'
network.@device[0].type='bridge'
network.@device[0].ports='eth0'
.....省略
さらに「@+タイプ名+インデックス」で匿名セクションを指定して表示させると「cfg+uid」形式で匿名セクションが表示されます。 uidはUCIシステムがセクション情報を管理するためのユニークなID番号です。匿名セクションの本当の名前と言っても良いかもしれません。
Programmable表記その2
root@OpenWrt:~# uci show network.@device[0]
.....省略
network.cfg030f15=device  <--「@+タイプ名+インデックス」の代わりに「cfg+uid」形式で表示されます
network.cfg030f15.name='br-lan'
network.cfg030f15.type='bridge'
network.cfg030f15.ports='eth0'
.....省略

実はあまり違いがない名前付きと匿名セクション

このようにセクションには名前付きと匿名の2種類が存在します。しかし正直な話、これらの違いはアプリケーションにとってはどうでも良いことです(※)。 大半のOpenWrtアプリケーションやその中の機能にとって大事なのは、特定の名前を持ったセクションではなく、 そのセクションが一体どんな種類の情報を持っているかです。そして、その情報の種類を示すのがタイプ情報になります。
ネットワーク・WiFi制御用アプリケーションのnetifdを例にすれば、LANのネットワークインタフェース設定を読み込むためには Lanセクション(network.lan)が必要なのではなく、名前は何でもいいけどタイプ情報がinterfaceのセクションが必要だということです。 (通常のOpenWrtのデフォルト設定では、LAN設定用にnetwork.lanが用意されていますので、このことを意識することはありません。)
タイプ情報がinterfaceであるセクションのオプションを読み込んだ結果、それがLAN設定として本当に正しいので目的とするLANインタフェースが適用 されるわけです。つまり、名前付きセクションとは人間が読みやすいように配慮して名前を与えられたセクションです。そのセクションを実際に管理するアプリケーション 側では、特定のセクションの名前を認識するケースはほとんど(もしくは全く)ありません。
注意:デフォルトではdhcpやfirewallコンフィグの各オプションで、networkコンフィグのlanセクション(network.lan)を 制御対象のネットワーク設定とするように名指しをしてますので、名前を変えるとパケットを通さなくなったりします。逆にオプションでターゲットとなるセクション名を指定しない限り、アプリケーション が特定のセクション名を認識することは(ほぼ)ないということを意味します。
このように、セクションの名前に縛られないことで、アプリケーションは同じ対象に関する複数の設定を管理できます。 大半のOpenWrtアプリケーションは同じ対象に関する設定を持ったセクションの読み込み順番により、適用する対象設定を決定します。 セクションの配置はreorderコマンドで変更可能です。
※セクション名を認識するアプリケーションやその中の一部機能もありますが、設定に対する柔軟性は高くありません。

上記の説明を裏付ける関数の1つとして、Luaスクリプト用UCI関数のget_first関数があります。

UCIコマンド一覧

ここまでの説明で、UCIコマンドの引数の指定方法が分ってきます。
以下はUCIコマンドのヘルプ画面に表示される説明を並べたものです。

個別のコマンドの詳細については、次節を確認してください。

UCIコマンド 引数フォーマット 用途
show [<config>[.<section>[.<option>]]] コンフィグ、セクション、タイプ、オプションの値を表示します。
get <config>.<section>[.<option>]=<value> 指定セクションのタイプ情報、オプション値を取得します。
set <config>.<section>[.<option>]=<value> 指定した設定ファイル、セクション、オプションの値を変更します。
add_list <config>.<section>.<option>=<string> セクションのリストを追加します。
add <config> <section-type> 新しい匿名セクションを追加します。
delete <config>.<section>[.<option>] 指定した設定ファイル、セクション、オプションを削除します。
del_list <config>.<section>.<option>=<string> セクションのリストを削除します。
commit [<config>] 変更を反映させるために使用します。
revert <config>[.<section>[.<option>]] 変更を破棄して元に戻すために使用します。
changes [<config>] 変更点を表示します。
rename <config>.<section>[.<option>]=<name> 設定ファイル、セクション、オプションの名前を変更します。
reorder <config>.<section>=<position> セクションの順序を変更します。
export [<config>] 指定された設定ファイルをファイルにエクスポートします。
import [<config>] 指定されたファイルから設定をインポートします。
batch 複数のUCIコマンドをバッチ処理します。

showコマンド

showコマンドは、指定UCIコンフィグレーションファイルのパラメーターをProgrammable表記で標準出力します。

このコマンドは、指定のUCIコンフィグレーションファイルに対応するステージング領域 (/tmp/.uci) とFLASH領域 (/etc/config) のマージ結果を表示します。 つまり、このコマンドの出力は、実際にOpenWrtが使用する設定値です

USAGE 1   全てのUCIコンフィグレーションファイルのパラメーターを標準出力する
uci show
引数を指定しないで実行すると、全てのUCIコンフィグレーションファイルのパラメーターを標準出力します。
root@OpenWrt:~# uci show
dhcp.odhcpd.maindhcp='0'
dhcp.odhcpd.leasefile='/tmp/hosts/odhcpd'
dhcp.odhcpd.leasetrigger='/usr/sbin/odhcpd-update'
dhcp.odhcpd.loglevel='4'
dropbear.@dropbear[0]=dropbear
dropbear.@dropbear[0].PasswordAuth='on'
dropbear.@dropbear[0].RootPasswordAuth='on'
dropbear.@dropbear[0].Port='22'
firewall.@defaults[0]=defaults
firewall.@defaults[0].syn_flood='1'
firewall.@defaults[0].input='ACCEPT'
firewall.@defaults[0].output='ACCEPT'
.....省略
USAGE 2   指定UCIコンフィグレーションファイルのパラメーターを標準出力する
uci show <config>
UCIコンフィグレーションファイル(例:network)を指定して実行すると、その対象が持つパラメーターを標準出力します。
root@OpenWrt:~# uci show network
network.loopback=interface
network.loopback.device='lo'
network.loopback.proto='static'
network.loopback.ipaddr='127.0.0.1'
network.loopback.netmask='255.0.0.0'
network.globals=globals
network.globals.ula_prefix='fdd6:3a80:bcd9::/48'
network.@device[0]=device
network.@device[0].name='br-lan'
network.@device[0].type='bridge'
network.@device[0].ports='eth0'
.....省略
※このとき、匿名セクションの表示はタイプ名にプレフィックス(接頭辞)「@」、サフィックス(接尾辞)にインデックス(添え字)を付けた仮の名前になります。 上の例では@device[0]が匿名セクションです。
USAGE 3   指定セクションのパラメーターを標準出力する
uci show <config>.<section>
UCIコンフィグレーションファイルとそのセクションを指定(今回の場合ではnetwork.lan)して実行すると、そのセクション内のパラメーターを標準出力します。
root@OpenWrt:~# uci show network.lan
network.lan=interface
network.lan.proto='static'
network.lan.netmask='255.255.255.0'
network.lan.ip6assign='60'
network.lan.ipaddr='192.168.4.1'
network.lan.device='wlan0'
また、匿名セクションを指定して実行すると「@+タイプ名+インデックス」の仮のセクション名の部分が「cfg+uid」形式 で表示されます。
root@OpenWrt:~# uci show network.@device[0]
network.cfg030f15=device
network.cfg030f15.name='br-lan'
network.cfg030f15.type='bridge'
network.cfg030f15.ports='eth0'
USAGE 4   指定パラメーターを標準出力する
uci show <section>.<section>.<option>
パラメーターを特定するための全ての情報(UCIコンフィグレーションファイル・セクション・オプション or リスト)を指定して実行すると、 そのパラメーターを標準出力します。
root@OpenWrt:~# uci show network.lan.proto
network.lan.proto='static'
また、匿名セクションが管理するパラメーターを指定して実行すると「@+タイプ名+インデックス」の仮のセクション名の部分が(cfg+uid)形式 で表示されます。
root@OpenWrt:~# uci show network.@device[0].name
network.cfg030f15.name='br-lan'

setコマンド

setコマンドは、指定されたセクションやパラメーターを変更または追加し、その結果をステージング領域である/tmp/.uciに保存します。

一般的に、その後にcommitコマンドを実行することで、ステージング領域(/tmp/.uci/)の内容がFLASH領域(/etc/config/)の対応する UCIコンフィグレーションファイルにコピー(マージ)されます。

ただし、ステージング領域はRAM上に配置されているため、rebootやpoweroffによって電源断が発生すると格納されたデータは消去されます。

USAGE 1   名前付きセクションを追加する
uci set <config>.<section>=<section-type>
次の例では、UCIコンフィグレーションファイルcoffeeを作成してbeansタイプのarabicaとrobustaセクションを追加しています。 追加したこれらセクションの内容はステージング領域に保存されます。
通常、このようにして作成したセクションに対し、さらにsetコマンドを使用してパラメーターを追加していきます(USAGE2)。
root@OpenWrt:~# touch /etc/config/coffee
root@OpenWrt:~# uci set coffee.arabica=beans
root@OpenWrt:~# uci set coffee.robusta=beans
root@OpenWrt:~# cat /tmp/.uci/coffee
coffee.arabica='beans'
coffee.robusta='beans'
USAGE 2   パラメーターを変更・追加する
uci set <config>.<section>.<option>=<value>
実行すると、既存パラメーターであれば変更、新規パラメーターであれば追加となります。 この結果はステージング領域に保存されます。
USAGE1の内容
root@OpenWrt:~# touch /etc/config/coffee
root@OpenWrt:~# uci set coffee.arabica=beans
root@OpenWrt:~# uci set coffee.robusta=beans
↓↓↓ここからが本題
root@OpenWrt:~# uci set coffee.arabica.scent='very good'
root@OpenWrt:~# uci set coffee.arabica.taste=excellent
root@OpenWrt:~# uci set coffee.robusta.scent=good
root@OpenWrt:~# uci set coffee.robusta.taste=good
root@OpenWrt:~# cat /tmp/.uci/coffee
coffee.arabica='beans'
coffee.robusta='beans'
coffee.arabica.scent='very good'
coffee.arabica.taste='excellent'
coffee.robusta.scent='good'
coffee.robusta.taste='good'

deleteコマンド

指定セクションやパラメーターを削除して、その結果をステージング領域である/tmp/.uciに保存します。

通常、続けてcommitコマンドを実行することでステージング領域(/tmp/.uci)の削除内容がFLASH領域(/etc/config) の対応するUCIコンフィグレーションファイルにコピー(マージ)されます。

※ステージング領域はRAM上に配置されるため、rebootやpoweroffによって電源断が発生すると格納データは消去されます。

USAGE 1   指定セクションを削除する
uci delete <config>.<section>
実行すると、指定セクションの削除が変更内容としてステージング領域に保存されます。 このときステージング領域では、マイナス付きで指定セクションが記録されていることが確認できます。
テスト用UCIコンフィグレーションファイルの作成
root@OpenWrt:~# touch /etc/config/coffee
root@OpenWrt:~# uci set coffee.arabica=beans
root@OpenWrt:~# uci set coffee.robusta=beans
root@OpenWrt:~# uci commit
↓↓↓ここからが本題
root@OpenWrt:~# uci delete coffee.arabica
root@OpenWrt:~# cat /tmp/.uci/coffee
-coffee.arabica
USAGE 2   指定パラメーターを削除する
uci delete <config>.<section>.<option>
実行すると、指定パラメーターの削除が変更内容としてステージング領域に保存されます。 このときステージング領域では、マイナス付きで指定パラメーターが記録されていることが確認できます。
テスト用UCIコンフィグレーションファイルの作成
root@OpenWrt:~# touch /etc/config/coffee
root@OpenWrt:~# uci set coffee.arabica=beans
root@OpenWrt:~# uci set coffee.robusta=beans
root@OpenWrt:~# uci set coffee.arabica.scent='very good'
root@OpenWrt:~# uci set coffee.arabica.taste=excellent
root@OpenWrt:~# uci set coffee.robusta.scent=good
root@OpenWrt:~# uci set coffee.robusta.taste=good
root@OpenWrt:~# uci commit coffee
↓↓↓ここからが本題
root@OpenWrt:~# uci delete coffee.robusta.scent
root@OpenWrt:~# cat /tmp/.uci/coffee
-coffee.robusta.scent

commitコマンド

setコマンドやdeleteコマンド、addコマンドなどによってステージング領域(/tmp/.uci)に保存されたパラメーター変更内容を FLASH領域(/etc/config)の対応するUCIコンフィグレーションファイルにコピー(マージ)します。

正常にcommitコマンドが実行されると、ステージング領域(/tmp/.uci)内の該当UCIコンフィグレーションファイルとそのパラメーターは消去されます。

通常、commitコマンド実行後は対象のUCIコンフィグレーションファイルを環境変数として使用するアプリケーション に対し、「/etc/init.d/network [reload or restart]」などを実行することで設定値を適用します。

USAGE 1   ステージング領域の全ての変更内容をFLASH領域にコピー(マージ)する
uci commit
引数を指定しないで実行すると、/tmp/.uciにステージングされている全てのパラメーター変更内容がFLASH領域(/etc/config)にコピーされます。
テスト用UCIコンフィグレーションファイルcoffeeの作成
root@OpenWrt:~# touch /etc/config/coffee
root@OpenWrt:~# uci set coffee.arabica=beans
root@OpenWrt:~# uci set coffee.robusta=beans
root@OpenWrt:~# uci set coffee.arabica.scent='very good'
root@OpenWrt:~# uci set coffee.arabica.taste=excellent
root@OpenWrt:~# uci set coffee.robusta.scent=good
root@OpenWrt:~# uci set coffee.robusta.taste=good
続けて、テスト用UCIコンフィグレーションファイルteaの作成
root@OpenWrt:~# touch /etc/config/tea
root@OpenWrt:~# uci set tea.darjeeling=leaf
root@OpenWrt:~# uci set tea.uva=leaf
root@OpenWrt:~# uci set tea.darjeeling.scent='very good'
root@OpenWrt:~# uci set tea.darjeeling.taste=excellent
root@OpenWrt:~# uci set tea.uva.scent=excellent
root@OpenWrt:~# uci set tea.uva.taste=excellent
root@OpenWrt:~# cat /tmp/.uci/coffee   <--上の操作で、ステージング領域に追加内容が入ってます
coffee.arabica='beans'
coffee.robusta='beans'
coffee.arabica.scent='very good'
coffee.arabica.taste='excellent'
coffee.robusta.scent='good'
coffee.robusta.taste='good'
root@OpenWrt:~# cat /tmp/.uci/tea     <--上の操作で、ステージング領域に追加内容が入ってます
tea.darjeeling='leaf'
tea.uva='leaf'
tea.darjeeling.scent='very good'
tea.darjeeling.taste='excellent'
tea.uva.scent='excellent'
tea.uva.taste='excellent'
root@OpenWrt:~# cat /etc/config/coffee   <--この時点では何も入っていないので表示されません
root@OpenWrt:~# cat /etc/config/tea
root@OpenWrt:~# uci commit      <--ステージング領域からFLASH領域へマージ(コミット)
root@OpenWrt:~# cat /etc/config/coffee   <--コミットされたので、追加内容が入ってます

config beans 'arabica'
        option scent 'very good'
        option taste 'excellent'

config beans 'robusta'
        option scent 'good'
        option taste 'good'

root@OpenWrt:~# cat /etc/config/tea   <--コミットされたので、追加内容が入ってます

config leaf 'darjeeling
        option scent 'very good'
        option taste 'excellent'

config leaf 'uva'
        option scent 'excellent'
        option taste 'excellent'

USAGE 2   ステージング領域の指定変更内容をFLASH領域にコピー(マージ)する
uci commit <config>
ステージング領域に存在する指定UCIコンフィグレーションファイルの変更内容を対応するFLASH領域にコピー(マージ)します。
テスト用UCIコンフィグレーションファイルcoffeeの作成
root@OpenWrt:~# touch /etc/config/coffee
root@OpenWrt:~# uci set coffee.arabica=beans
root@OpenWrt:~# uci set coffee.robusta=beans
root@OpenWrt:~# uci set coffee.arabica.scent='very good'
root@OpenWrt:~# uci set coffee.arabica.taste=excellent
root@OpenWrt:~# uci set coffee.robusta.scent=good
root@OpenWrt:~# uci set coffee.robusta.taste=good
続けて、テスト用UCIコンフィグレーションファイルteaの作成
root@OpenWrt:~# touch /etc/config/tea
root@OpenWrt:~# uci set tea.darjeeling=leaf
root@OpenWrt:~# uci set tea.uva=leaf
root@OpenWrt:~# uci set tea.darjeeling.scent='very good'
root@OpenWrt:~# uci set tea.darjeeling.taste=excellent
root@OpenWrt:~# uci set tea.uva.scent=excellent
root@OpenWrt:~# uci set tea.uva.taste=excellent
root@OpenWrt:~# cat /tmp/.uci/coffee   <--上の操作で、ステージング領域に追加内容が入ってます
coffee.arabica='beans'
coffee.robusta='beans'
coffee.arabica.scent='very good'
coffee.arabica.taste='excellent'
coffee.robusta.scent='good'
coffee.robusta.taste='good'
root@OpenWrt:~# cat /tmp/.uci/tea     <--上の操作で、ステージング領域に追加内容が入ってます
tea.darjeeling='leaf'
tea.uva='leaf'
tea.darjeeling.scent='very good'
tea.darjeeling.taste='excellent'
tea.uva.scent='excellent'
tea.uva.taste='excellent'
root@OpenWrt:~# cat /etc/config/coffee   <--この時点では何も入っていないので表示されません
root@OpenWrt:~# cat /etc/config/tea
root@OpenWrt:~# uci commit coffee    <--coffeeに対して、ステージング領域からFLASH領域へマージ(コミット)
root@OpenWrt:~# cat /etc/config/coffee   <--コミットされたので、追加内容が入ってます

config beans 'arabica'
        option scent 'very good'
        option taste 'excellent'

config beans 'robusta'
        option scent 'good'
        option taste 'good'

root@OpenWrt:~# cat /etc/config/tea   <--コミットされてないので、何も入ってません
root@OpenWrt:~#

revertコマンド

setコマンドやdeleteコマンド、addコマンドによってステージング領域(/tmp/.uci)に保存されたパラメーター変更内容を消去します。

USAGE 1   指定UCIコンフィグレーションファイルの変更内容を消去する
uci revert <config>
UCIコンフィグレーションファイルを指定して実行すると、対応するステージング領域の内容を消去します。
テスト用UCIコンフィグレーションファイルの作成
root@OpenWrt:~# touch /etc/config/robot
root@OpenWrt:~# uci set robot.GM=MobileSuit
root@OpenWrt:~# uci set robot.GM.affiliation=EFSF
root@OpenWrt:~# uci set robot.GM.height='18.0[m] (by wikipedia)'
root@OpenWrt:~# uci set robot.GM.weight='41.2[t] (by wikipedia)'
root@OpenWrt:~# uci set robot.GM.weapon='spray gun'
root@OpenWrt:~# uci commit
↓↓↓ここからが本題
root@OpenWrt:~# uci delete robot.GM.weapon
root@OpenWrt:~# cat /tmp/.uci/robot
-robot.GM.weapon
root@OpenWrt:~# uci revert robot
root@OpenWrt:~# cat /tmp/.uci/robot
root@OpenWrt:~#
USAGE 2   指定セクションの変更内容を消去する
uci revert <config>.<section>
UCIコンフィグレーションファイルとそのセクションを指定して実行すると、対応するステージング領域のセクション の変更内容を消去します。
テスト用UCIコンフィグレーションファイルの作成
root@OpenWrt:~# touch /etc/config/robot
root@OpenWrt:~# uci set robot.GM=MobileSuit
root@OpenWrt:~# uci set robot.GM.affiliation=EFSF
root@OpenWrt:~# uci set robot.GM.height='18.0[m] (by wikipedia)'
root@OpenWrt:~# uci set robot.GM.weight='41.2[t] (by wikipedia)'
root@OpenWrt:~# uci set robot.GM.weapon='spray gun'
root@OpenWrt:~# uci set robot.ZAKU=MobileSuit
root@OpenWrt:~# uci set robot.ZAKU.affiliation=ZEON
root@OpenWrt:~# uci set robot.ZAKU.height='17.5[m] (by wikipedia)'
root@OpenWrt:~# uci set robot.ZAKU.weight='75.2[t] (by wikipedia)'
root@OpenWrt:~# uci set robot.ZAKU.weapon='zaku machinegun'
root@OpenWrt:~# uci commit
↓↓↓ここからが本題
root@OpenWrt:~# uci delete robot.GM.weapon
root@OpenWrt:~# uci delete robot.ZAKU.weapon
root@OpenWrt:~# cat /tmp/.uci/robot
-robot.GM.weapon
-robot.ZAKU.weapon
root@OpenWrt:~# uci revert robot.ZAKU
root@OpenWrt:~# cat /tmp/.uci/robot
-robot.GM.weapon
USAGE 3   指定パラメーターの変更内容を消去する
uci revert <config>.<section>.<option>
パラメーターを特定するための全ての情報(UCIコンフィグレーションファイル・セクション・オプション or リスト)を指定して実行すると、対応するステージング領域の指定パラメーター の変更内容を消去します。
テスト用UCIコンフィグレーションファイルの作成
root@OpenWrt:~# touch /etc/config/robot
root@OpenWrt:~# uci set robot.ZAKU=MobileSuit
root@OpenWrt:~# uci set robot.ZAKU.affiliation=ZEON
root@OpenWrt:~# uci set robot.ZAKU.height='17.5[m] (by wikipedia)'
root@OpenWrt:~# uci set robot.ZAKU.weight='75.2[t] (by wikipedia)'
root@OpenWrt:~# uci set robot.ZAKU.weapon='zaku machinegun'
↓↓↓ここからが本題
root@OpenWrt:~# uci show robot
robot.ZAKU='MobileSuit'
robot.ZAKU.affiliation='ZEON'
robot.ZAKU.height='17.5[m] (by wikipedia)'
robot.ZAKU.weight='75.2[t] (by wikipedia)'
robot.ZAKU.weapon='zaku machinegun'
root@OpenWrt:~# uci revert robot.ZAKU.affiliation
root@OpenWrt:~# uci revert robot.ZAKU.weight
root@OpenWrt:~# cat /tmp/.uci/robot
robot.ZAKU='MobileSuit'
robot.ZAKU.height='17.5[m] (by wikipedia)'
robot.ZAKU.weapon='zaku machinegun'

getコマンド

指定セクションのタイプ情報やパラメーター(option)の値を取得します。
通常、getコマンドはスクリプトやプログラム内で使用します。

USAGE1   指定セクションのタイプ情報を取得する
uci get <config>.<section>
特定のコンフィグのセクションを指定して実行すると、そのタイプ情報を取得します。 通常、シェルやプログラムの変数に取得値を格納させるため、次のようにエラー出力を無効にする サイレントモードオプション-qをつけて実行します。
root@OpenWrt:~# getdata=$(uci -q get network.lan)
root@OpenWrt:~# echo $getdata
interface
USAGE2   指定パラメーターの値を取得する
uci get <config>.<section>.<option>
特定のパラメーターを指定して実行すると、その値を取得します。 通常、シェルやプログラムの変数に取得値を格納させるため、次のようにエラー出力を無効にする サイレントモードオプション-qをつけて実行します。
root@OpenWrt:~# getdata=$(uci -q get network.lan.ipaddr)
root@OpenWrt:~# echo $getdata
192.168.2.1

addコマンド

指定したタイプ情報で匿名セクションを任意のUCIコンフィグレーションファイルに追加します。 追加内容はステージング領域(/tmp/.uci)に保存されます。

通常、続いてcommitコマンドを実行することでステージング領域の追加内容をFLASH領域(/etc/config)にコピーします。

※ステージング領域はRAM上に配置されるため、rebootやpoweroffによって電源断が発生すると格納データは消去されます。

USAGE   匿名セクションを追加する
uci add <config> <section-type>
任意のUCIコンフィグレーションファイルに指定タイプの匿名セクションを作成・追加します。
正常に実行されると、UCIシステム側で自動生成された名前「cfg+uid」が表示されます。
root@OpenWrt:~# touch /etc/config/test
root@OpenWrt:~# uci add test utakamo
cfg066b17
root@OpenWrt:~# cat /tmp/.uci/test
+test.cfg066b17='utakamo'
root@OpenWrt:~# uci commit
root@OpenWrt:~# uci show test
test.@utakamo[0]=utakamo

add_listコマンド

任意のセクションにリストデータを作成して追加します。
リストデータの追加内容はステージング領域(/tmp/.uci)に保存されます。

通常、続けてcommitコマンドを実行することでステージング領域(/tmp/.uci/)の追加内容がFLASH領域(/etc/config/) の対応するUCIコンフィグレーションファイルにコピー(マージ)されます。

※ステージング領域はRAM上に配置されるため、rebootやpoweroffによって電源断が発生すると格納データは消去されます。

USAGE   セクションにリストを追加する
uci add_list <config>.<section>.<option>=<string>
リストに対してパラメーターを指定して実行すると、そのリストのデータとして指定パラメーターが 登録されます(このとき、対象リストが存在しない場合は作成されます)。次は、testの匿名セクションにtestlistという名前のリストを追加し、データを次々に登録している例です。
root@OpenWrt:~# touch /etc/config/test
root@OpenWrt:~# uci add test utakamo
cfg066b17
root@OpenWrt:~# uci add_list test.@utakamo[0].testlist=1
root@OpenWrt:~# uci add_list test.@utakamo[0].testlist=2
root@OpenWrt:~# uci add_list test.@utakamo[0].testlist=3
root@OpenWrt:~# uci add_list test.@utakamo[0].testlist=4
root@OpenWrt:~# uci add_list test.@utakamo[0].testlist=5
root@OpenWrt:~# cat /tmp/.uci/test
+test.cfg066b17='utakamo'
|test.cfg066b17.testlist='1'
|test.cfg066b17.testlist='2'
|test.cfg066b17.testlist='3'
|test.cfg066b17.testlist='4'
|test.cfg066b17.testlist='5'

del_listコマンド

任意のセクションのリストデータを削除します。
リストデータの削除内容はステージング領域(/tmp/.uci)に保存されます。

通常、続けてcommitコマンドを実行することでステージング領域(/tmp/.uci/)の削除内容がFLASH領域(/etc/config/) の対応するUCIコンフィグレーションファイルにコピー(マージ)されます。

※ステージング領域はRAM上に配置されるため、rebootやpoweroffによって電源断が発生すると格納データは消去されます。

USAGE   任意セクションのリストデータを削除する
uci del_list <config>.<section>.<option>=<string>
既存リストの任意データを削除します。次は、testの匿名セクションに対してtestlistという名前の リストから、値が2のリストデータを削除する例です。
テスト用UCIコンフィグレーションファイルの作成
root@OpenWrt:~# touch /etc/config/test
root@OpenWrt:~# uci add test utakamo
cfg066b17
root@OpenWrt:~# uci add_list test.@utakamo[0].testlist=1
root@OpenWrt:~# uci add_list test.@utakamo[0].testlist=2
root@OpenWrt:~# uci add_list test.@utakamo[0].testlist=3
root@OpenWrt:~# uci commit test
↓↓↓ここからが本題
root@OpenWrt:~# uci del_list test.@utakamo[0].testlist=2
root@OpenWrt:~# cat /tmp/.uci/test
~test.cfg066b17.testlist='2'

renameコマンド

USAGE 1   セクションの名前を変更する
uci rename <config>.<section>=<name>
既存UCIコンフィグレーションファイルのセクション名を変更します。
テスト用UCIコンフィグレーションファイルの作成
root@OpenWrt:~# touch /etc/config/test
root@OpenWrt:~# uci add test blog
cfg01a6c9
root@OpenWrt:~# uci show test
test.@blog[0]=blog
root@OpenWrt:~# uci set test.@blog[0].data1=GoodMorning
root@OpenWrt:~# uci set test.@blog[0].data2=Hello
root@OpenWrt:~# uci set test.@blog[0].data3=GoodNight
root@OpenWrt:~# uci commit
↓↓↓ここからが本題
root@OpenWrt:~# uci show test
test.@blog[0]=blog
test.@blog[0].data1='GoodMorning'
test.@blog[0].data2='Hello'
test.@blog[0].data3='GoodNight'
root@OpenWrt:~# uci rename test.@blog[0]=utakamo  <--セクションをutakamoに変更
root@OpenWrt:~# cat /tmp/.uci/test
@test.cfg01a6c9='utakamo'
root@OpenWrt:~# uci commit
root@OpenWrt:~# uci show test
test.utakamo=blog
test.utakamo.data1='GoodMorning'
test.utakamo.data2='Hello'
test.utakamo.data3='GoodNight'
USAGE 2   オプションの名前を変更する
uci rename <config>.<section>.<option>=<name>
既存UCIコンフィグレーションファイルのオプション名を変更します。
テスト用UCIコンフィグレーションファイルの作成
root@OpenWrt:~# touch /etc/config/test
root@OpenWrt:~# cat /etc/config/test
root@OpenWrt:~# uci add test utakamo
cfg016b17
root@OpenWrt:~# uci set test.@utakamo[0].data=hello
root@OpenWrt:~# cat /tmp/.uci/test
+test.cfg016b17='utakamo'
test.cfg016b17.data='hello'
root@OpenWrt:~# uci commit
↓↓↓ここからが本題
root@OpenWrt:~# uci show test
test.@utakamo[0]=utakamo
test.@utakamo[0].data='hello'
root@OpenWrt:~# uci rename test.@utakamo[0].data=value  <--オプション名をvalueに変更
root@OpenWrt:~# cat /tmp/.uci/test
@test.cfg016b17.data='value'
root@OpenWrt:~# uci commit
root@OpenWrt:~# uci show test
test.@utakamo[0]=utakamo
test.@utakamo[0].value='hello'

reorderコマンド

USAGE   UCIコンフィグレーションファイル内のセクション配置を変更する
uci reorder <config>.<section>=<position-index>
UCIシステムはコンフィグレーションファイルを読み込んだときに、セクションの出現順序に応じてシステム内部でインデックスを付与します(posと呼ばれています)。
例として、UCIコンフィグレーションファイルのtestに3つのセクションが存在するとき、UCIシステム上では先頭から順に0、1、2のインデックスが付与されます。
Programmable表記
root@OpenWrt:~# uci show test
test.sectionA=typeA  <--pos:0
test.sectionA.value1='1'
test.sectionA.value2='2'
test.sectionA.value3='3'
test.sectionB=typeB  <--pos:1
test.sectionB.value1='4'
test.sectionB.value2='5'
test.sectionB.value3='6'
test.sectionC=typeC  <--pos:2
test.sectionC.value1='7'
test.sectionC.value2='8'
test.sectionC.value3='9'

Human-Friendly表記
root@OpenWrt:~# cat /etc/config/test

config typeA 'sectionA'  <--pos:0
        option value1 '1'
        option value2 '2'
        option value3 '3'

config typeB 'sectionB'  <--pos:1
        option value1 '4'
        option value2 '5'
        option value3 '6'

config typeC 'sectionC'  <--pos:2
        option value1 '7'
        option value2 '8'
        option value3 '9'
reorderコマンドは、このインデックスを利用して任意のセクション配置を変更します。
次は上記のtestファイルに対して、sectionBを先頭に配置変更する例です。
root@OpenWrt:~# uci reorder test.sectionB=0
root@OpenWrt:~# uci changes test
test.sectionB='0'  <--タイプが変更されたわけではなく、配置場所を示す数字が=付きで表現されます
root@OpenWrt:~# uci commit test

Programmable表記
root@OpenWrt:~# uci show test
test.sectionB=typeB  <--pos:0
test.sectionB.value1='4'
test.sectionB.value2='5'
test.sectionB.value3='6'
test.sectionA=typeA  <--pos:1
test.sectionA.value1='1'
test.sectionA.value2='2'
test.sectionA.value3='3'
test.sectionC=typeC  <--pos:2
test.sectionC.value1='7'
test.sectionC.value2='8'
test.sectionC.value3='9'

Human-Friendly表記
root@OpenWrt:~# cat /etc/config/test

config typeB 'sectionB'  <--pos:0
        option value1 '4'
        option value2 '5'
        option value3 '6'

config typeA 'sectionA'  <--pos:1
        option value1 '1'
        option value2 '2'
        option value3 '3'

config typeC 'sectionC'  <--pos:2
        option value1 '7'
        option value2 '8'
        option value3 '9'
reorderコマンドによる配置変更は一見意味がないように感じます。しかし、設定情報を示すセクションデータの増減に対応したOpenWrtアプリケーション にとっては適用対象のデータを選び出す操作として非常に重要です。つまり、数ある設定情報の中から適用対象を決定するために、ほとんどのOpenWrtアプリケーションは セクションの読み込み順番を判断材料にしています。そのアプリケーションがUCIコンフィグレーションファイルをロードしたとき、最初または最後 に読み込んだセクションを最終的な対象データとして決定します。先頭または末尾のセクションを優先するかはアプリケーションの設計によって異なります。複数の設定を管理できる 仕組みについてはこちらをお読みください。

exportコマンド

USAGE 1   全てのUCIコンフィグレーションファイルの内容をUCI構文で標準出力する
uci export
/etc/config内の全てのUCIコンフィグレーションファイルをUCI構文で標準出力します。 このとき、UCIコンフィグレーションファイルの名前はpackage <name>で表されます。もっと言えばたったそれだけです。
root@OpenWrt:~# uci export
package dropbear

config dropbear
        option PasswordAuth 'on'
        option RootPasswordAuth 'on'
        option Port '22'

package duckdump

config duckdump 'target'
        option nic 'wlan0'

package firewall

config defaults
        option syn_flood '1'
        option input 'ACCEPT'
        option output 'ACCEPT'
        option forward 'REJECT'

...省略
通常、リダイレクトでファイル出力するのが一般的かと思います。
この操作はUCIコンフィグレーションファイルのフルバックアップに相当します。 バックアップファイルはimportコマンドでインポートできます。
root@OpenWrt:~# uci export > full_backup
USAGE 2   指定UCIコンフィグレーションファイルの内容を標準出力する
uci export <config>
指定したUCIコンフィグレーションファイルの内容をUCI構文で標準出力します。 このとき、UCIコンフィグレーションファイルの名前はpackage <file-name>で表されます。もっと言えばたったそれだけです
root@OpenWrt:~# uci export dropbear
package dropbear

config dropbear
        option PasswordAuth 'on'
        option RootPasswordAuth 'on'
        option Port '22'
通常、リダイレクトでファイル出力するのが一般的かと思います。
この操作は指定UCIコンフィグレーションファイルのバックアップに相当します。 このバックアップファイルはimportコマンドでインポートできます。
root@OpenWrt:~# uci export dropbear > dropbear_backup

[TIPS]: UCI構文
exportコマンドによって出力されるUCI設定情報はUCI構文形式です。
Human-Friendly表記形式に加え、UCIコンフィグレーションファイル名をpackage <file-name>の形式で記載しているだけです。

root@OpenWrt:~# uci export sample
package sample   <---UCIコンフィグレーションファイル名を指します

config type 'section'
    option value1 '1'
    option value2 '2'
    option value3 '3'

importコマンド

UCI設定を対象ファイルにインポートします。

USAGE 1   標準入力によるUCI構文の設定情報を対象ファイルにインポートする
uci import <config>
標準入力によるUCI構文の設定情報を任意のUCIコンフィグレーションファイル<config>にコピーします。 このとき、UCIコンフィグレーションファイル<config>が持っていた既存の内容は全て上書きされ、代わりにインポートした設定情報が記録されます。
※UCI構文はuci exportによって出力されるUCIコンフィグレーションファイルの記述形式を指します。
root@OpenWrt:~# touch /etc/config/test
root@OpenWrt:~# uci import test
package test
config typeA 'section'
    option value1 '1'
    option value2 '2'
    option value3 '3'
「CTRL + D」でEOF
root@OpenWrt:~# uci show test
test.section=typeA
test.section.value1='1'
test.section.value2='2'
test.section.value3='3'
USAGE 2   UCI構文の設定情報を対象ファイルにインポートする
uci -f <file> import <config>
UCI構文の設定情報が記載されたファイル<file>を-fオプションで指定し、その内容を任意のUCIコンフィグレーションファイル<config>にコピーします。 このとき、UCIコンフィグレーションファイルが持っていた既存の内容は全て上書きされ、代わりにインポートした設定情報が記録されます。
※UCI構文はuci exportによって出力されるUCIコンフィグレーションファイルの記述形式を指します。
テスト用UCIコンフィグレーションファイルの作成
root@OpenWrt:cd /etc/config
root@OpenWrt:/etc/config# touch test
root@OpenWrt:/etc/config# uci set test.blog=utakamo
root@OpenWrt:/etc/config# uci set test.blog.data1=hello
root@OpenWrt:/etc/config# uci set test.blog.data2=byebye
root@OpenWrt:/etc/config# uci commit
root@OpenWrt:/etc/config# uci show test
test.blog=utakamo
test.blog.data1='hello'
test.blog.data2='byebye'
↓↓↓ここからが本題
root@OpenWrt:/etc/config# uci export dropbear > dropbear_backup  <--dropbearをエクスポート
root@OpenWrt:/etc/config# uci -f dropbear_backup import test  <--ここでインポート
root@OpenWrt:/etc/config# uci show test
test.@dropbear[0]=dropbear
test.@dropbear[0].PasswordAuth='on'
test.@dropbear[0].RootPasswordAuth='on'
test.@dropbear[0].Port='22'
USAGE 3   UCI構文の設定情報を対象UCIコンフィグレーションファイルにマージインポートする
uci -f <file> -m import <config>
UCI構文の設定情報が記載されたファイル<file>を-fで指定し、-mオプションによって、その内容を任意のUCIコンフィグレーションファイル<config>に マージインポートします。
※UCI構文はuci exportによって出力されるUCIコンフィグレーションファイルの記述形式を指します。
なお、マージ内容はステージング領域に一旦保存されます。
続いてuci commitを実行することで、その内容がFLASH領域にコピーされます。
テスト用UCIコンフィグレーションファイルの作成
root@OpenWrt:~# cd /etc/config
root@OpenWrt:/etc/config# touch test
root@OpenWrt:/etc/config# uci add test utakamo
cfg016b17
root@OpenWrt:/etc/config# uci set test.@utakamo[0].data=1
root@OpenWrt:/etc/config# uci show test
test.@utakamo[0]=utakamo
test.@utakamo[0].data='1'
↓↓↓ここからが本題
root@OpenWrt:/etc/config# uci export dropbear > dropbear_backup  <--dropbearをエクスポート
root@OpenWrt:/etc/config# uci -f dropbear_backup -m import test  <--ここでマージインポート
root@OpenWrt:/etc/config# uci changes test
test.cfg024dd4='dropbear'0'
test.cfg024dd4.PasswordAuth='on'
test.cfg024dd4.RootPasswordAuth='on'
test.cfg024dd4.Port='22'.5'
root@OpenWrt:/etc/config# uci commit
root@OpenWrt:/etc/config# uci show test
test.@utakamo[0]=utakamo
test.@utakamo[0].data='1'
test.@dropbear[0]=dropbear
test.@dropbear[0].PasswordAuth='on'
test.@dropbear[0].RootPasswordAuth='on'
test.@dropbear[0].Port='22'

changesコマンド

USAGE 1   ステージング領域に保存された全ての変更内容を標準出力する
uci changes
ステージング領域(/tmp/.uci)に保存された全てのUCIコンフィグレーションファイルの変更内容を標準出力します。 現在、これは[cat /tmp/.uci/*]と等価の処理結果です。
root@OpenWrt:~# touch /etc/config/test1
root@OpenWrt:~# uci set test1.blog=utakamo
root@OpenWrt:~# uci set test1.blog.data=hello
root@OpenWrt:~# touch /etc/config/test2
root@OpenWrt:~# uci set test2.blog=utakamo
root@OpenWrt:~# uci set test2.blog.data=goodbye
root@OpenWrt:~# uci changes
test1.blog='utakamo'
test1.blog.data='hello'
test2.blog='utakamo'
test2.blog.data='goodbye'
USAGE 2   ステージング領域の指定UCIコンフィグレーションファイルの変更内容を標準出力する
uci changes <config>
指定したUCIコンフィグレーションファイルに対応するステージング領域(/tmp/.uci)が保存する変更内容を標準出力します。 現在、これは[cat /tmp/.uci/~]と等価の処理結果です。
root@OpenWrt:~# touch /etc/config/test1
root@OpenWrt:~# uci set test1.blog=utakamo
root@OpenWrt:~# uci set test1.blog.data=hello
root@OpenWrt:~# touch /etc/config/test2
root@OpenWrt:~# uci set test2.blog=utakamo
root@OpenWrt:~# uci set test2.blog.data=goodbye
root@OpenWrt:~# uci changes test1
test1.blog='utakamo'
test1.blog.data='hello'

batchコマンド

USAGE   UCIコマンドのバッチ処理を実行する
uci batch << EOI
<uci command>
<uci command>
<uci command>
<uci command>
....
EOI
uciコマンドをまとめて実行します。
次はテスト用UCIコンフィグレーションファイル(/etc/config/test)を作成して、 その中にセクションとオプションをバッチ処理で作成する例です。
バッチ処理対象のコマンドの前にuciを付ける必要はありません。
root@Openwrt:~# touch /etc/config/test
root@OpenWrt:~# uci batch << EOI
> set test.blog=utakamo
> set test.blog.data1=hello
> set test.blog.data2='Is my blog easy and readable?'
> set test.blog.data3=goodbye
> EOI
root@OpenWrt:~# uci changes test
test.blog='utakamo'
test.blog.data1='hello'
test.blog.data2='Is my blog easy and readable?'
test.blog.data3='goodbye'
もちろん、既存のUCIコンフィグレーションファイルに対してもバッチ処理が可能です。
次は既存のUCIコンフィグレーションファイル(network)に対してバッチ処理をする例です。
root@OpenWrt:~# uci batch << EOI
> set network.test=utakamo
> set network.test.data1=hello
> set network.test.data2='Is my blog easy and readable?'
> set network.test.data3=goodbye
> EOI
root@OpenWrt:~# uci changes network
network.test='utakamo'
network.test.data1='hello'
network.test.data2='Is my blog easy and readable?'
network.test.data3='goodbye'
さらに、uci batchコマンドに与える引数のヒアドキュメント内ではシェル変数が使用できます。
次はシェル変数を基にバッチ処理をする例です。
root@Openwrt:~# touch /etc/config/test
↓↓↓シェル変数を宣言
root@OpenWrt:~# config=test
root@OpenWrt:~# type=utakamo
root@OpenWrt:~# section=blog
↓↓↓シェル変数を基にバッチ処理
root@OpenWrt:~# uci batch << EOI
> set $config.$section=$type
> set $config.$section.data1=hello
> set $config.$section.data2='Is my blog easy and readable?'
> set $config.$section.data3=goodbye
> EOI
root@OpenWrt:~# uci changes test
test.blog='utakamo'
test.blog.data1='hello'
test.blog.data2='Is my blog easy and readable?'
test.blog.data3='goodbye'
複数のUCIパラメータを一括で変更したい場合は、batchコマンドを使った方が効率が良いと思います。

関連記事

参考文献