En un contexto con elementos secundarios dinámicos, puede resultar muy útil iterar entre esos elementos secundarios mediante programación. Para ello se puede utilizar la función list, que devuelve una matriz de elementos secundarios dinámicos.
script run('shares'); projects = list(); for (i = 0; i < projects.length; i++) { run('select ' + projects[i]); shares = list(); for (j = 0; j < shares.length; j++) { run('select ' + shares[j]); printf("%s/%s %1.64g %1.64g\n", projects[i], shares[j], get('space_data'), get('space_available')); run('cd ..'); } run('cd ..'); }
% ssh root@koi < space.aksh Password: admin/accounts 18432 266617007104 admin/exports 18432 266617007104 admin/primary 18432 266617007104 admin/traffic 18432 266617007104 admin/workflow 18432 266617007104 aleventhal/hw_eng 18432 266617007104 bcantrill/analytx 1073964032 266617007104 bgregg/dashbd 18432 266617007104 bgregg/filesys01 26112 107374156288 bpijewski/access_ctrl 18432 266617007104 ...
script run('shares'); projects = list(); printf('%-40s %-10s %-10s\n', 'SHARE', 'USED', 'AVAILABLE'); for (i = 0; i < projects.length; i++) { run('select ' + projects[i]); shares = list(); for (j = 0; j < shares.length; j++) { run('select ' + shares[j]); share = projects[i] + '/' + shares[j]; used = run('get space_data').split(/\s+/)[3]; avail = run('get space_available').split(/\s+/)[3]; printf('%-40s %-10s %-10s\n', share, used, avail); run('cd ..'); } run('cd ..'); }
% ssh root@koi < prettyspace.aksh Password: SHARE USED AVAILABLE admin/accounts 18K 248G admin/exports 18K 248G admin/primary 18K 248G admin/traffic 18K 248G admin/workflow 18K 248G aleventhal/hw_eng 18K 248G bcantrill/analytx 1.00G 248G bgregg/dashbd 18K 248G bgregg/filesys01 25.5K 100G bpijewski/access_ctrl 18K 248G ...
El formato es: list ([depth, [filter]]). El argumento depth se puede definir con un número. Cuanto mayor sea el número de depth, mayor será el nivel de detalle devuelto. El formato del argumento filter es {<prop1>:<val1>, <prop2>:<val2> ...}. Si se especifica filter, también se debe especificar depth.
Uso y comportamiento de la entrada:
list(): devuelve solo nombres de nodos.
list(0): devuelve propiedades de nodos y solo nombres de elementos secundarios.
list(0, {kiosk_mode: true}): devuelve una lista filtrada para kiosk_mode true con nombres de elementos secundarios.
list(1): devuelve propiedades de nodos, nombres y propiedades de elementos secundarios, solo nombres de elementos terciarios.
list(1, {kiosk_mode: true}): devuelve una lista filtrada para kiosk_mode true con detalles hasta depth=1.
list(2): devuelve propiedades de nodos, nombres y propiedades de elementos secundarios y la salida de list(0) de elementos terciarios.
list(2, {fullname:'Super*', kiosk_mode: true}): devuelve una lista filtrada para fullname que contiene Super y kiosk_mode con el valor true con detalles hasta depth=2.
La etiqueta name muestra el nombre del elemento de la lista (es decir, un nodo). La etiqueta properties muestra las propiedades del elemento de la lista. La etiqueta children muestra los elementos secundarios estáticos del elemento de la lista. La etiqueta list muestra los elementos secundarios dinámicos del elemento de la lista.
script ("." to run)> dump(list(2)); ("." to run)> . [{ name: 'restuser', properties: { kiosk_screen: 'status/dashboard', kiosk_mode: false, roles: ['basic'], require_annotation: false, initial_password: 'DummyPassword', fullname: 'REST User', logname: 'restuser' }, children: [{ name: 'preferences', properties: { advanced_analytics: false, session_timeout: 15, login_screen: 'status/dashboard', locale: 'C' } }, { name: 'exceptions', list: [{ name: 'auth-000', properties: { allow_configure: false, scope: 'alert' } }, { name: 'auth-001', properties: { allow_workgroup: false, allow_domain: false, name: '*', scope: 'ad' } }] }] }]