File: intro-3.html

package info (click to toggle)
linuxconf 1.26r4-2
  • links: PTS
  • area: main
  • in suites: woody
  • size: 56,432 kB
  • ctags: 27,217
  • sloc: cpp: 158,803; perl: 7,484; sh: 4,134; java: 3,105; ansic: 2,492; makefile: 2,216; python: 109
file content (662 lines) | stat: -rw-r--r-- 25,322 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
 <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
 <TITLE>Shellmod: Protocolo</TITLE>
 <LINK HREF="intro-4.html" REL=next>
 <LINK HREF="intro-2.html" REL=previous>
 <LINK HREF="intro.html#toc3" REL=contents>
</HEAD>
<BODY>
<A HREF="intro-4.html">Next</A>
<A HREF="intro-2.html">Previous</A>
<A HREF="intro.html#toc3">Contents</A>
<HR>
<H2><A NAME="s3">3. Protocolo</A></H2>

<P>N&oacute;s agora apresentamos os v&aacute;rios comandos editados pelo script. Estes
commandos s&atilde;o divididos por tarefa.
<P>
<H2><A NAME="ss3.1">3.1 Estrutura de comandos e coloca&ccedil;&atilde;o de aspas</A>
</H2>

<P>Todos os comandos s&atilde;o enviados ao shellmod atrav&eacute;s do comando echo. Eles
sempre se parecem com:
<P>
<BLOCKQUOTE><CODE>
<PRE>
        echo command arg1 arg2 arg3
        
</PRE>
</CODE></BLOCKQUOTE>
<P>Os argumentos podem ser palavras simples, ou v&aacute;rias palavras separadas por espa&ccedil;os.
Para agrupar m&uacute;ltiplas palavras como um argumento simples, deve-se usar aspas.
Apesar de isto ser uma pr&aacute;tica comum em linhas de commando, existe um detalhe: as aspas
ir&atilde;o afetar apenas o argumento conforme visto pelo comando <CODE>echo</CODE>.
Uma vez processada, a linha inteira ser&aacute; recebida como um fluxo simples de palavras
separadas por espa&ccedil;os e as aspas desaparecer&atilde;o. As aspas devem ser parte da linha
recebida pelo shellmod. Veja um exemplo:
<P>
<BLOCKQUOTE><CODE>
<PRE>
        echo newf_str name \"Digite seu nome\" \"Tux, o ping&uuml;im\"
        
</PRE>
</CODE></BLOCKQUOTE>
<P>A biblioteca shellmod-lib.sh define a fun&ccedil;&atilde;o <CODE>qecho</CODE> que ajudar&aacute; voc&ecirc;
a ter um comportamento de aspas padr&atilde;o. O seguinte &eacute; um exemplo reescrito
com <CODE>qecho</CODE>.
<P>
<BLOCKQUOTE><CODE>
<PRE>
        qecho newf_str name "Digite seu nome" 'Tux, o ping&uuml;im'
        
</PRE>
</CODE></BLOCKQUOTE>
<P>Como voc&ecirc; pode ver, com <CODE>qecho</CODE> voc&ecirc; pode misturar as diferentes sintaxes
de aspas do shell. A fun&ccedil;&atilde;o <CODE>qecho</CODE> assegura que as aspas agregam todos
os argumentos.
<P>
<P>
<H2><A NAME="ss3.2">3.2 Enviando par&acirc;metros em v&aacute;rias linhas</A>
</H2>

<P>Scripts shell n&atilde;o s&atilde;o t&atilde;o bons em manipular e entregar texto em v&aacute;rias linhas.
O comando "defval" foi criado para consertar isso.
Eis aqui uma forma t&iacute;pica de utliza&ccedil;&atilde;o:
<P>
<BLOCKQUOTE><CODE>
<PRE>
        echo var1 "Esta &eacute; a primeira linha"
        echo var1 "Esta &eacute; a segunda linha"
        echo error =var1
        
</PRE>
</CODE></BLOCKQUOTE>
<P>Isto cria uma mensagem popup de erro com duas linhas. "defval" &eacute; usado
repetidamente para definir o texto em v&aacute;rias linhas e &eacute; referenciado como um
argumento utilizando o sinal = . O argumento n&atilde;o pode estar entre aspas. Deste modo,
voc&ecirc; n&atilde;o pode utilizar a fun&ccedil;&atilde;o qecho usando um par&acirc;metro defvar parameter, porque
qecho necessita de aspas fechando todos os par&acirc;metros.
<P>
<H2><A NAME="ss3.3">3.3 Construindo um di&aacute;logo.</A>
</H2>

<P>
<P>
<H3>echo DIALOG</H3>

<P>Um di&aacute;logo sempre inicia com este comando. Ele n&atilde;o requere nenhum argumento a mais.
Depois voc&ecirc; acrescenta defini&ccedil;&otilde;es de campos, adiciona bot&otilde;es opcionais
e ent&atilde;o voc&ecirc; chama a fun&ccedil;&atilde;o edit. Eis aqui um exemplo:
<P>
<BLOCKQUOTE><CODE>
<PRE>
        echo DIALOG
        echo newf_str var \"t&iacute;tulo do campo\" value
        edho edit \"T&iacute;tulo do di&aacute;logo\" \"Introdu&ccedil;&atilde;o do Di&aacute;logo\"
        dispatch
        echo end
        
</PRE>
</CODE></BLOCKQUOTE>
<P>
<H3>echo show \"t&iacute;tulo\" \"Introdu&ccedil;&atilde;o\"</H3>

<P>Isto funciona do mesmo modo que o edit. Ele apresenta o di&aacute;logo com os mesmos
argumentos, mas retorna imediatamente. Geralmente &eacute; usado com o comando
<A HREF="#newf_gauge">newf_gauge</A>.
<P>
<P>
<H3>dispatch</H3>

<P>Passa o controle para Linuxconf/shellmod e espera pelos resultados.
As vari&aacute;veis de campo s&atilde;o atualizadas e a vari&aacute;vel CODE recebe o valor do
bot&atilde;o selecionado pelo usu&aacute;rio: Pode ser tanto "accept" (aceitar) como
"cancel" (cancelar).
<P>
<H3>echo end</H3>

<P>Isto apaga o di&aacute;logo. Ele &eacute; removido da tela e esquecido.
N&oacute;s editamos freq&uuml;entemente o comando end logo ap&oacute;s o comando
dispatch. Mas di&aacute;logos mais complexos podem utilizar o comando
end ap&oacute;s um loop de valida&ccedil;&atilde;o.
<P>
<H3>Um exemplo completo</H3>

<P>
<BLOCKQUOTE><CODE>
<PRE>
#!/usr/bin/shellmod
. /usr/lib/linuxconf/lib/shellmod-lib.sh
main(){
        echo DIALOG
        echo newf_str name \"Nome de Usu&aacute;rio\"
        while true
        do
                echo edit \"Perguntas ao usu&aacute;rio\" \"Entre com o nome de usu&aacute;rio\"
                dispatch
                if [ "$CODE" = "cancel" ] ; then
                        break
                elif [ "$name" = "" ] ; then
                        echo error \"Por favor entre com um nome\"
                else
                        echo notice \"Fazendo algo com a conta do usu&aacute;rio\"
                        break
                fi
        done
        echo end
}
dispatch
        
</PRE>
</CODE></BLOCKQUOTE>
                        
<P>
<H2><A NAME="ss3.4">3.4 Construindo um menu</A>
</H2>

<P>Isto &eacute; manipulado pelos comandos DIALOG_MENU e new_menuitem.
<P>
<H3>echo DIALOG_MENU</H3>

<P>N&atilde;o requere nenhum argumento.
<P>
<H3>echo new_menuitem function prompt titulo</H3>

<P>Isto registra mais uma entrada no menu. Cada entrada de menu &eacute; associada
com uma fun&ccedil;&atilde;o de script (que deve ser definida). O prompt
geralmente &eacute; uma palavra-chave. O t&iacute;tulo &eacute; o restante da entrada do menu.
<P>
<H3>echo editmenu \"T&iacute;tulo do Menu\" \"Introdu&ccedil;&atilde;o\"</H3>

<P>Isto faz o menu aparecer. &Eacute; seguido por uma chamada a dispatch.
<P>
<H3>dispatch</H3>

<P>Aqui &eacute; onde tudo &eacute; realizado para o menu. A fun&ccedil;&atilde;o dispatch
ser&aacute; executada at&eacute; que o usu&aacute;rio selecione o bot&atilde;o "quit".
A fun&ccedil;&atilde;o correspondente &eacute; chamada sempre que uma entrada de menu
for selecionada. Isto &eacute; manipulado transparentemente pela fun&ccedil;&atilde;o
dispatch.
<P>Observe que a fun&ccedil;&atilde;o dispatch tamb&eacute;m termina se o usu&aacute;rio selecionar
algum bot&atilde;o opcional (adicionados com o comando button).
Deste modo &eacute; poss&iacute;vel executar o controle em um loop como o di&aacute;logo
do exemplo acima.
<P>
<H3>echo end</H3>

<P>Apaga o menu.
<P>
<H3>Um exemplo completo</H3>

<P>
<BLOCKQUOTE><CODE>
<PRE>
#!/usr/bin/shellmod
. /usr/lib/linuxconf/lib/shellmod-lib.sh
menufunc1(){
        echo notice \"menufunc1 selecionado\"
}
menufunc2(){
        echo notice \"menufunc2 selecionado\"
}
main(){
        echo DIALOG_MENU
        echo new_menuitem menufunc1 Select \"Primeira op&ccedil;&atilde;o\"
        echo new_menuitem menufunc2 \"\" \"Segunda op&ccedil;&atilde;o\"
        echo editmenu \"Menu principal\" \"Escolha uma op&ccedil;&atilde;o\"
        dispatch
        echo end
}
dispatch
        
</PRE>
</CODE></BLOCKQUOTE>
<P>
<H2><A NAME="ss3.5">3.5 Gerenciando uma lista de registros</A>
</H2>

<P>
<H3>echo DIALOG_LIST</H3>

<P>DIALOG_LIST &eacute; apenas uma varia&ccedil;&atilde;o de um menu. A principal diferen&ccedil;a &eacute; que
o n&uacute;mero da entrada pode ser bem longo. Nesse caso, um di&aacute;logo
de filtro ser&aacute; apresentado para restringir o n&uacute;mero de registros mostrados.
Voc&ecirc; pode ent&atilde;o lidar com uma lista muito grande de itens.
<P>DIALOG_LIST n&atilde;o requer nenhum argumento.
<P>
<H3>echo newf_head \"T&iacute;tulo da Coluna 1\" \"T&iacute;tulo da Coluna 2\" ...</H3>

<P>Voc&ecirc; pode definir o cabe&ccedil;alho da lista. Isto &eacute; opcional, mas fica com
um aspecto muito melhor.
<P>
<H3>echo new_menuitem \"Argumentos da fun&ccedil;&atilde;o\" \"Valor da Coluna 1\" \"Valor da Coluna 2\" ...</H3>

<P>Funciona como DIALOG_MENU, exceto por n&oacute;s normalmente fornecermos mais colunas.
Existe uma outra varia&ccedil;&atilde;o quando a fun&ccedil;&atilde;o &eacute; definida com argumentos.
Observe que este modo pode ser utilizado com DIALOG_MENU da mesma forma. N&oacute;s
geralment definimos uma fun&ccedil;&atilde;o por entrada de menu e uma fun&ccedil;&atilde;o simples para
processar cada registro da lista, usando o argumento para diferenciar o
processamento.
<P>Observe tamb&eacute;m que voc&ecirc; pode usar uma solu&ccedil;&atilde;o mista com o mesmo DIALOG_MENU
ou DIALOG_LIST: voc&ecirc; pode utilizar uma fun&ccedil;&atilde;o simples para fornecer um
processamento comum para alguns registros e uma fun&ccedil;&atilde;o diferente para
gerenciar exce&ccedil;&otilde;es.
<P>
<H3>echo editmenu \"T&iacute;tulo da lista\" \"Introdu&ccedil;&atilde;o\"</H3>

<P>Igual a DIALOG_MENU.
<P>
<H3>dispatch</H3>

<P>Isto se comporta como DIALOG_MENU.
<P>
<H3>echo end</H3>

<P>Isto apaga a lista.
<P>
<H3>Um exemplo completo</H3>

<P>Eis aqui um exemplo real onde n&oacute;s apresentamos um diret&oacute;rio e
permitimos que o usu&aacute;rio escolha um arquivo para fazer algo com ele.
N&oacute;s vemos neste exemplo como &eacute; f&aacute;cil analisar a sa&iacute;da do comando
"<CODE>ls -l</CODE>" e apresentar o nome do arquivo, o tamanho e a data
de revis&atilde;o em um formato de tr&ecirc;s colunas.
<BLOCKQUOTE><CODE>
<PRE>
#!/usr/bin/shellmod
. /usr/lib/linuxconf/lib/shellmod-lib.sh
fileshow(){
        echo notice \"Processando arquivo $1\"
}
main(){
        echo DIALOG_LIST
        echo newf_head \"Nome do Arquivo\" Size \"Data de Revis&atilde;o\"
        ls -l $1 | \
                (
                read total
                while read perm count user group size month day hour name
                do
                        echo new_menuitem \"fileshow $name\" $name $size \"$month $day $hour\"
                done
                )
        echo editmenu \"Diret&oacute;rio Atual\" \"Mostra todos os arquivos no diret&oacute;rio atual\"
        dispatch
        echo end
}
dispatch
</PRE>
</CODE></BLOCKQUOTE>
<P>
<H2><A NAME="ss3.6">3.6 Definindo campos</A>
</H2>

<P>Todos os comandos que definem um campo de di&aacute;logo iniciam com o prefixo <CODE>newf_</CODE>.
N&oacute;s usamos a mesma ordem de nome e de par&acirc;metro (quando poss&iacute;vel) conforme
a API do m&oacute;dulo C++.
<P>O primeiro argumento &eacute; sempre o nome da vari&aacute;vel shell a qual receber&aacute;
o valor entrado pelo usu&aacute;rio. Voc&ecirc; utilizar&aacute; freq&uuml;entemente a seguinte
constru&ccedil;&atilde;o para editar (corrigir o valor atual) de uma determinada
vari&aacute;vel.
<P>
<BLOCKQUOTE><CODE>
<PRE>
        qecho newf_str var "title" "$var"
        .
        qecho edit ...
        dispatch
        if [ "$CODE" = "accept" ] ; then
                if [ "$var" = "..." ] ;then
                        .
                        .
                fi
        fi
        
</PRE>
</CODE></BLOCKQUOTE>
<P>
<H2><A NAME="ss3.7">3.7 Lista de comandos</A>
</H2>

<P>Here is the list of all field definition commands:
<P>
<UL>
<LI>
<A HREF="#newf_chk">newf_chk</A></LI>
<LI>
<A HREF="#newf_chkm">newf_chkm</A></LI>
<LI>
<A HREF="#newf_combo">newf_combo</A></LI>
<LI>
<A HREF="#newf_dbl">newf_dbl</A></LI>
<LI>
<A HREF="#newf_enum">newf_enum</A></LI>
<LI>
<A HREF="#newf_gauge">newf_gauge</A></LI>
<LI>
<A HREF="#newf_hexnum">newf_hexnum</A></LI>
<LI>
<A HREF="#newf_list">newf_list</A></LI>
<LI>
<A HREF="#newf_num">newf_num</A></LI>
<LI>
<A HREF="#newf_pass">newf_pass</A></LI>
<LI>
<A HREF="#newf_radio">newf_radio</A></LI>
<LI>
<A HREF="#newf_slider">newf_slider</A></LI>
<LI>
<A HREF="#newf_str">newf_str</A></LI>
<LI>
<A HREF="#newf_title">newf_title</A></LI>
</UL>
<P>
<P>
<P>
<H3><A NAME="newf_chk"></A> echo newf_chk var \"T&iacute;tulo do campo\" \"Valor inicial 0 ou 1\" \"T&iacute;tulo do sufixo\"        </H3>

<P>Define um campo de caixa de verifica&ccedil;&atilde;o (lig/des ou sim/n&atilde;o). A vari&aacute;vel var
ser&aacute; definida como 0 ou 1. Este campo tem dois t&iacute;tulos. Um na esquerda da
caixa de verifica&ccedil;&atilde;o e um na direita. No Linuxconf, isto &eacute; freq&uuml;entemente
usado da seguinte maneira:
<P>
<BLOCKQUOTE><CODE>
<PRE>
        A seguinte caracter&iacute;stica [ ] est&aacute; selecionada
        
</PRE>
</CODE></BLOCKQUOTE>
<P>
<H3>Varia&ccedil;&otilde;es da sintaxe de newf_chk</H3>

<P>Quando voc&ecirc; usar newf_chk, voc&ecirc; deve passar valores 0 ou 1. A vari&aacute;vel edit
receber&aacute; esse valor como 0 ou 1. Isto n&atilde;o &eacute; muito &uacute;til, j&aacute; que, com freq&uuml;&ecirc;ncia,
scripts shell lidam com diferentes tipos de valores booleanos. Por exemplo,
um script tratando com um servidor SQL pode se deparar com valores como Y e N.
Para evitar a tradu&ccedil;&atilde;o de um sistema para o outro, a sintaxe do valor inicial
foi expandida.
<P>
<UL>
<LI>Para facilitar as coisas, o shellmod aceita como valor selecionado
qualquer coisa entre 1, Y e Yes (ma&iacute;usculas ou min&uacute;sculas). A menos
que o contr&aacute;rio seja explicitado, estes valores ser&atilde;o traduzidos para 1.
Todo o restante ser&aacute; traduzido para 0.</LI>
<LI>Utilizando um formato especial de tr&ecirc;s campos, pode-se especificar o valor
real e o dicion&aacute;rio utilizado para interpret&aacute;-lo. O valor deve ser
especificado da seguinte maneira:

<BLOCKQUOTE><CODE>
<PRE>
                valor:valor_lig:valor_des
                
</PRE>
</CODE></BLOCKQUOTE>


Deste modo, se a sua aplica&ccedil;&atilde;o est&aacute; lidando com valores ON/OFF, voc&ecirc; pode
especificar o valor inicial desta forma:

<BLOCKQUOTE><CODE>
<PRE>
                $var:ON:OFF
                
</PRE>
</CODE></BLOCKQUOTE>


N&atilde;o s&oacute; os valores ON e OFF ser&atilde;o aceitos pelo interpretador, como
tamb&eacute;m o resultado final ser&aacute; enviado ao script usando uma daquelas
palavras.</LI>
</UL>
<P>
<H3><A NAME="newf_chkm"></A> echo newf_chkm var \"t&iacute;tulo do campo\" \"valor num&eacute;rico inicial\" \"valor1\" \"valor2\" ...        </H3>

<P>Configura&ccedil;&atilde;o de campos de sele&ccedil;&atilde;o m&uacute;ltipla utilizando caixas de verifica&ccedil;&atilde;o.
As caixas s&atilde;o apresentadas horizontalmente. Eis um exemplo seguido do campo
produzido em modo texto:
<P>
<BLOCKQUOTE><CODE>
<PRE>
        echo newf_chkm sel \"Qual posi&ccedil;&atilde;o\" 1 esquerda centro direita
        
</PRE>
</CODE></BLOCKQUOTE>
<P>This produces:
<P>
<BLOCKQUOTE><CODE>
<PRE>
        Qual posi&ccedil;&atilde;o    ( ) esquerda  (o) centro ( ) direita
        
</PRE>
</CODE></BLOCKQUOTE>
<P>A vari&aacute;vel var conter&aacute; o &iacute;ndice num&eacute;rico do item selecionado,
iniciando em 0.
<P>
<H3><A NAME="newf_combo"></A> echo newf_combo var \"t&iacute;tulo do campo\" \"Valor inicial\"        </H3>

<P>Configura uma linha simples + campo seletor. O usu&aacute;rio ser&aacute; capaz de selecionar um valor
dentre uma lista de valores ou entrar com um outro manualmente. A vari&aacute;vel var ir&aacute;
conter o valor textual seja ele digitado ou selecionado.
<P>newf_combo &eacute; usado com o comando comboitem. Voc&ecirc; configura antes o campo
combo e ent&atilde;o voc&ecirc; passa um por um os valores poss&iacute;veis utilizando
comboitem. Observe que os valores s&atilde;o seguidos por um texto descritivo
(opcional). Segue abaixo um c&oacute;digo exemplo:
<P>
<BLOCKQUOTE><CODE>
<PRE>
        echo newf_combo port \"Qual porta\" ttyS1
        echo comboitem ttyS0 \"COM1 no DOS\"
        echo comboitem ttyS1 \"COM2 no DOS\"
        echo comboitem ttyS2 \"COM3 no DOS\"
        
</PRE>
</CODE></BLOCKQUOTE>
<P>A vari&aacute;vel $port conter&aacute; o valor ttyS0, ttyS1, ttyS2 ou qualquer coisa
que o usu&aacute;rio digite. Veja 
<A HREF="#newf_enum">newf_enum</A>
e 
<A HREF="#newf_list">newf_list</A> para varia&ccedil;&otilde;es deste campo
de entrada.
<P>
<H3><A NAME="newf_dbl"></A> echo newf_dbl var \"t&iacute;tulo do campo\" \"valor num&eacute;rico inicial\" numero-de-casas        </H3>

<P>Configura um campo de entrada num&eacute;rico com nota&ccedil;&atilde;o decimal. Funciona
como <CODE>
<A HREF="#newf_num">newf_num</A></CODE>
exceto por permitir um ponto decimal. O par&acirc;metro n&uacute;mero-de-casas
controla o n&uacute;mero de d&iacute;gitos permitidos ap&oacute;s o ponto decimal bem como a
formata&ccedil;&atilde;o do campo.
<P>
<H3><A NAME="newf_enum"></A> echo newf_enum var \"t&iacute;tulo do campo\" \"Valor num&eacute;rico inicial\"        </H3>

<P>Configura um campo seletor. O usu&aacute;rio ser&aacute; capaz de selecionar um valor
dentre uma lista de sele&ccedil;&atilde;o. A vari&aacute;vel var conter&aacute; o &iacute;ndice dos itens
selecionados. O usu&aacute;rio &eacute; limitado a escolher um &uacute;nico item da lista.
<P>newf_enum &eacute; usado com o comando enumitem. Voc&ecirc; configura primeiro o
campo enum e ent&atilde;o passa um por um os valores poss&iacute;veis utilizando
enumitem. Segue abaixo um c&oacute;digo exemplo:
<P>
<BLOCKQUOTE><CODE>
<PRE>
        echo newf_enum no \"Qual porta\" 1
        echo enumitem ttyS0 \"COM1 no DOS\"
        echo enumitem ttyS1 \"COM2 no DOS\"
        echo enumitem ttyS2 \"COM3 no DOS\"
        
</PRE>
</CODE></BLOCKQUOTE>
<P>A vari&aacute;vel $no conter&aacute; o valor 0, 1 ou 2. Veja
<A HREF="#newf_combo">newf_combo</A> e
<A HREF="#newf_list">newf_list</A>
para varia&ccedil;&otilde;es deste campo de entrada.
<P>
<H3><A NAME="newf_gauge"></A> echo newf_gauge ID \"t&iacute;tulo do campo\" \"Valor decimal inicial\" \"Valor m&aacute;ximo\"        </H3>

<P>Configura um indicador visual de medida, geralmente usada para mostrar o progresso
de execu&ccedil;&atilde;o de um processo (carregamento, instala&ccedil;&atilde;o). O estado do indicador
&eacute; alterado &agrave; cada chamada a este comando. A primeira chamada define o campo,
as pr&oacute;ximas atualizam o indicador. Este widget &eacute; geralmente utilizado com o comando
"show" de forma que o script nunca p&aacute;ra no estado "edit".
Eis aqui um pequeno exemplo:
<P>
<BLOCKQUOTE><CODE>
<PRE>
        echo DIALOG
        qecho newf_gauge ID "Status" 0 10
        qecho show "Status" ""
        i=0
        while [ "$i" != "10" ] ; do
            i=`expr $i + 1`
            sleep 1
            qecho newf_gauge ID "Status" $i 10
            qecho show "Status" ""
        done
        
</PRE>
</CODE></BLOCKQUOTE>
<P>
<H3><A NAME="newf_hexnum"></A> echo newf_hexnum var \"t&iacute;tulo do campo\" \"Valor hexadecimal inicial\"        </H3>

<P>Configura um campo de entrada num&eacute;rico (inteiro). Funciona como
<CODE>
<A HREF="#newf_num">newf_num</A></CODE>
mas aceita d&iacute;gitos num&eacute;ricos e hexadecimais.
<P>
<H3><A NAME="newf_list"></A> echo newf_list var \"t&iacute;tulo do campo\" \"Valor inicial\"        </H3>

<P>Configura um campo seletor. O usu&aacute;rio poder&aacute; selecionar um valor
dentre uma lista. A vari&aacute;vel var ir&aacute; conter o valor textual
selecionado.
<P>newf_list &eacute; utilizado com o comando listitem. Voc&ecirc; primeiro configura
o campo de lista e ent&atilde;o voc&ecirc; passa um por um todos os valores
poss&iacute;veis usando listitem. Observe que os valores s&atilde;o seguidos por um
texto descritivo (opcional).
Segue um c&oacute;digo exemplo:
<P>
<BLOCKQUOTE><CODE>
<PRE>
        echo newf_list port \"Qual porta\" ttyS1
        echo listitem ttyS0 \"COM1 no DOS\"
        echo listitem ttyS1 \"COM2 no DOS\"
        echo listitem ttyS2 \"COM3 no DOS\"
        
</PRE>
</CODE></BLOCKQUOTE>
<P>A vari&aacute;vel $port conter&aacute; o valor ttyS0, ttyS1 ou ttyS2.
Veja 
<A HREF="#newf_enum">newf_enum</A>
e 
<A HREF="#newf_combo">newf_combo</A>
para varia&ccedil;&otilde;es neste campo de entrada.
<P>
<H3><A NAME="newf_num"></A> echo newf_num var \"t&iacute;tulo do campo\" \"Valor num&eacute;rico inicial\"        </H3>

<P>Configura um campo de entrada num&eacute;rico (inteiro). Funciona como <CODE>newf_str</CODE>
mas aceita apenas um d&iacute;gito.
<P>
<H3><A NAME="newf_pass"></A> echo newf_pass var \"t&iacute;tulo do campo\" \"Valor inicial\"        </H3>

<P>Configura um campo de senha. Funciona como o campo <CODE>newf_str</CODE> exceto
pela entrada n&atilde;o ser ecoada (digita&ccedil;&atilde;o invis&iacute;vel).
<P>
<H3><A NAME="newf_radio"></A> echo newf_radio var \"t&iacute;tulo do campo\" valor-num&eacute;rico valor-da-inst&acirc;ncia \"t&iacute;tulo do sufixo\"        </H3>

<P>Configura um campo de bot&atilde;o de r&aacute;dio. V&aacute;rios campos de bot&atilde;o de r&aacute;dio devem
ser definidos para cada sele&ccedil;&atilde;o poss&iacute;vel. Todos os bot&otilde;es de r&aacute;dio que compartilham
a mesma vari&aacute;vel de entrada (var, acima) operam juntos: ligar um desliga o outro
e vice-versa. A vari&aacute;vel var conter&aacute; o valor num&eacute;rico do campo de bot&atilde;o de r&aacute;dio
selecionado.
<P>Bot&otilde;es de r&aacute;dio selecionados podem ser colocados em qualquer lugar em um di&aacute;logo.
Eles n&atilde;o precisam estar em seq&uuml;&ecirc;ncia nem mesmo na mesma p&aacute;gina do di&aacute;logo.
<P>
<H3><A NAME="newf_slider"></A> echo newf_slider var \"t&iacute;tulo do campo\" \"Valor decimal inicial\" \"Valor m&iacute;nimo\" \"Valor m&aacute;ximo\"        </H3>

<P>Isto funciona como newf_num, para editar um valor decimal. Mas &eacute;
mostrado como um bot&atilde;o deslizante. Os valores m&iacute;nimo e m&aacute;ximo representam as
margens esquerda e direita do bot&atilde;o deslizante.
<P>
<BLOCKQUOTE><CODE>
<PRE>
        qecho newf_slider var "Hora de Reuni&atilde;o" 15 9 16
        
</PRE>
</CODE></BLOCKQUOTE>
<P>
<H3><A NAME="newf_str"></A> echo newf_str var \"t&iacute;tulo do campo\" \"Valor inicial\"        </H3>

<P>Configura uma entrada de texto de uma linha.
<P>
<H3><A NAME="newf_title"></A> echo newf_title "T&iacute;tulo da P&aacute;gina" level "T&iacute;tulo Esquerdo" "T&iacute;tulo em modo texto"        </H3>

<P>Isto n&atilde;o &eacute; um campo de entrada, mas &eacute; uma forma de organizar um grande di&aacute;logo
em uma se&ccedil;&atilde;o. O resultado final &eacute; bem diferente em modo gr&aacute;fico do que em em
texto ou HTML. Em modo gr&aacute;fico, isto criar&aacute; um di&aacute;logo em um bloco de notas
e cada newf_title define uma p&aacute;gina do bloco de notas.
<P>O primeiro argumento, o t&iacute;tulo da p&aacute;gina, &eacute; usado apenas em modo gr&aacute;fico.
<P>O segundo argumento &eacute; um n&uacute;mero e representa o n&iacute;vel do bloco de notas. Isto
permite di&aacute;logos muito complexos com blocos de notas dentro de blocos de notas.
Em modos texto e HTML mode, este argumento n&atilde;o tem efeito.
<P>
<UL>
<LI>Um valor de 0 adiciona uma divis&atilde;o horizontal entre dois campos.
o "T&iacute;tulo em modo texto" &eacute; centrado nesta divis&atilde;o.</LI>
<LI>Um valor de 1 cria o primeiro n&iacute;vel do bloco de notas. Um valor de 2
cria um sub-bloco de notas com o atual.</LI>
</UL>
<P>O terceiro argumento, t&iacute;tulo esquerdo, &eacute; utilizado apenas em modo texto e HTML.
Ele coloca um pequeno t&iacute;tulo &agrave; esquerda dos campos de entrada.
<P>O &uacute;ltimo argumento, T&iacute;tulo em modo texto, aparece centrado entre dois campos
de entrada.
<P>
<H2><A NAME="ss3.8">3.8 Adicionando bot&otilde;es</A>
</H2>

<P>Voc&ecirc; pode adicionar bot&otilde;es opcionais usando simplesmente o comando button.
Ele requer dois argumentos. O primeiro &eacute; a ID (identifica&ccedil;&atilde;o) do bot&atilde;o que ser&aacute;
passada ao script utilizando a vari&aacute;vel CODE. O segundo &eacute; o r&oacute;tulo (t&iacute;tulo)
do bot&atilde;o. Segue abaixo um exemplo:
<P>
<BLOCKQUOTE><CODE>
<PRE>
        echo DIALOG
        echo newf_str name \"Nome de usu&aacute;rioe\" $name
        echo button Add \"Adicionar novo usu&aacute;rio\"
        echo edit "title" \"Gerenciamento de usu&aacute;rios\"
        dispatch
        echo end
        if [ "$CODE" = "Add" ] ; then
                # Adicionando um novo usu&aacute;rio
        elif [ "$CODE" = "accept" ] ; then
                # Inspecionando um registro de usu&aacute;rio
        fi
        
</PRE>
</CODE></BLOCKQUOTE>
<P>
<H2><A NAME="ss3.9">3.9 Configura o campo atual de entrada</A>
</H2>

<P>O c&oacute;digo de opera&ccedil;&atilde;o "setcurfield" coloca o foco do teclado em um campo espec&iacute;fico.
Voc&ecirc; deve passar a ID (identifica&ccedil;&atilde;o) do campo como um argumento simples. Eis um exemplo:
<P>
<BLOCKQUOTE><CODE>
<PRE>
        qecho DIALOG
        qecho newf_str uid "ID de Usu&aacute;rio" 
        qecho newf_str name "Nome" 
        qecho newf_str phone "Nome"
        qecho setcurfield name
        qecho edit "exemplo" "O foco agora est&aacute; no nome"
        dispatch
        echo end 
        
</PRE>
</CODE></BLOCKQUOTE>
<P>
<HR>
<A HREF="intro-4.html">Next</A>
<A HREF="intro-2.html">Previous</A>
<A HREF="intro.html#toc3">Contents</A>
</BODY>
</HTML>