http://www.zago.eti.br/script/variavel.txt Use CTRL+F para refinar a pesquisa. Linha de: **************** separa mensagens ou tópicos. ******************************************************** Zago http://www.zago.eti.br/menu.html FAQ e artigos sobre Linux veja também no diretório raiz o FAQ bash.txt http://www.tldp.org/LDP/abs/html/localvar.html Exemplos de script com funções e variaveis local. ******************************************************************** Algumas variaveis do sistema, na linha de comando digite: Pra ver todas as variaveis e seu conteúdo: set Ou pra ver uma variavel especifica, digite: echo $VARIAVEL, ex.: Pra ver o idioma em uso: echo $LANG Pra ver o path echo $PATH Ou pra obter o mesmo resultado com grep: set | grep LANG Definir variavel: VARIAVEL=valor Exportar esta variavel para o AMBIENTE. export VARIAVEL Ver o conteúdo da VARIAVEL: echo $VARIAVEL Ver o conteúdo de todas as variaveis, execute: env Veja também no manual sobre setenv: man setenv setenv - change or add an environment variable man set Identificar qual shell em uso: echo $SHELL [root@mdv2006 ~]# echo $SHELL /bin/bash ******************************************************************** echo mostrando conteúdo de variáveis. for i in `cat calcular.txt` do MSOMA=$(`echo 'scale=2; $MSOMA+$i' | bc`) #echo 'scale=2; 20/3' | bc # MSOMA=$[$i+$MSOMA] # MSOMA=`expr $MSOMA + $i` done echo $MSOMA ******************************************************************** IFS = InputFieldSeparator Muitos comandos utilizam espaço como separador, principalmente na entrada de dados para os comandos como if e uso do cat, awk e etc... Para não alterar a configuração do sistema, pode alterar somente em tempo de execução do script, salve o conteúdo de IFS em uma variável, no final do script volte para o que era antes. Algo mais ou menos assim. # inicio do script. OLD_IFS=$IFS #Salva IFS atual em OLD_IFS IFS=: #definie novo separador para IFS, utilize conforme o separador usado no arquivo # seus comandos, loop como while e for... # fim dos comandos do script IFS=$OLD_IFS #restaura valores originais do IFS ******************************************************************** Resultado do comando Pra cada comando executado em shell tem um codigo de retorno, útil em script pra conferir se falhou ou foi executado com sucesso, este resultado fica armazenado na variavel $?, ele muda a cada comando, tanto faz se foi na linha de comando ou dentro do script, pra cada comando esta variavel é atualizada, "echo $?" sempre exibirá o resultado do ultimo comando. Retornando: 0 (zero) significa que o comando anterior foi executado com sucesso. 1 (um) e qualquer valor diferente de zero ( != 0) indica que ocorreu algum erro. 2 erro nos comandos do script, geralmete erro de sintaxe, digitação, 127 = command not found, pra quando digita comando não existente. Exemplos: [zago@faqcl10 tmp]$ touch meuteste [zago@faqcl10 tmp]$ echo $? 0 [zago@faqcl10 tmp]$ ls meusdoc ls: meusdoc: Arquivo ou diretório não encontrado [zago@faqcl10 tmp]$ echo $? 1 [zago@faqcl10 tmp]$ ls meuteste [zago@faqcl10 tmp]$ echo $? 0 Explicando: retornou 1 (um) quando falhou o comando "ls meusdoc" e retornou zero para os demais comandos que foram executados sem problemas. Cuidado pra não repetir "echo $?" porque ele também é um comando e altera o retorno, portanto vale somente o primeiro "echo $?" depois do comando. Script pra testar esta condição: cat /tmp/testar #!/bin/bash mkdir /tmp/teste if [ $? -eq 0 ];then echo $? echo "comando executado com sucesso!" else echo $? echo "falha na execução do comando." exit fi Neste exemplo a linha "if [ $? -eq 0 ]" verifica o retorno do comando "mkdir /tmp/teste" pra saber se o seu mkdir foi bem sucedido ou não. Na primeira vez que executar retorna zero, depois passa a retornar 1 porque o diretório já existe. ******************************************************************** Colocar o tamanho do arquivo em variavel para comparações. Script pra gravar CD e testar tamanho da ISO. #!/bin/bash # pegar tamanho do arquivo arqtam=$(du cl10_cd1.iso | awk '{print $1}') # comparar se maior que 600000 if [ $arqtam -gt 600000 ]; then echo " arquivo maior que o limite do CD" exit 1 else echo " tamanho OK, gravando CD" # comandos para gravar CD. fi Outros exemplos para carregar em arqtam o tamanho de arquivo. arqtam=`du arquivo | awk '{print $1}'` ******************************************************************** Salvar variáveis em arquivo. Criar e testar VAR1 VAR1=teste echo $VAR1 teste Salvar em arquivo. echo $VAR1 > /tmp/arqtemp.txt cat /tmp/arqtemp.txt teste Recuperar em VAR2 VAR2=$(cat /tmp/arqtemp.txt) echo $VAR2 teste remover arqtemp.txt no final do script rm -rf /tmp/arqtemp.txt ******************************************************************** Variável com a hora do sistema HATUAL=`date +%H` echo $HATUAL Variável com o nome do mes atual mes=`date '+%B'` zago@suse64:/tmp> echo $mes junho ******************************************************************** prinf prinf é um comando (built-in) do bash, pode consultar no manual do bash ou no resumo. man bash man printf info printf Segue copia parcial do manual do Conectiva 10 printf - formata e imprime dados DESCRIÇÃO Esta documentação não está sendo mais mantida e pode estar desatual- izada ou incompleta. A documentação Texinfo é agora a fonte oficial. Esta página de manual documenta a versão GNU do printf. printf imprime a cadeia de caracteres formato , interpretando diretivas `%' e teclas de escape `\' do mesmo modo que a função `printf' do C. O argumento formato é reutilizado tantas vezes forem necessárias para converter todos os argumentos dados. O printf interpreta o `\0ooo' como um número octal (`ooo' é de 0 a 3 dígitos) especificando um caractere para imprimir, e `\xhhh' como um número hexadecimal (`hhh' é de 1 a 3 dígitos) especificando um carac- tere para imprimir. Ele possui um escape adicional, o `\c', que faz com que o printf não produza saídas adicionais, e uma diretiva adicional, a `%b', que imprime seus argumentos com o caractere de escape `\' inter- pretado de modo que eles estejam na cadeia de caracteres formato . Alguns exemplos de uso, alinhar à direita. HATUAL=`date +%H` echo $HATUAL Imprimir o conteúdo da variável com 6 espaços a esquerda printf "%6s"$HATUAL 01 altere o 6 para o numero de espaços desejado. Inserir final de linha acresente \n Sem \n acrescenta um resultado após o outro sem quebra de linha, serve para concatenar. printf "%6s\n" $HATUAL printf "%0s\n" "Meu texto a direita" com zero a esquerda tem resultado igual a echo. echo "Meu texto a direita" printf "%20s\n" Meu texto a direita. Meu texto a direita. Sem aspas acima quebrou a linha em cada espaço, para não quebrar coloque entre aspas. printf "%40s\n" "Meu texto a direita" Meu texto a direita echo "Meu texto a direita" | awk '{ printf "%4s%8s\n",$1, $2 }' Meu texto Onde o primeiro campo ($1) terá o tamanho de 4 caracteres, o segundo ($2) 8 caracteres e assim por diante %4s define o tamanho de 4 caracteres %8s define o tamanho de 8 caracteres \n final de linha, saltar linha. $1 primeiro campo recebido de awk $2 segundo campo.recebido de awk com sinal menos preenche com espaços a direita da string (alinha a esquerda) echo "Meu texto a esquerda" | awk '{ printf "%-15s%-15s%-15s\n",$1,$2,$3}' Meu texto a ******************************************************************** ******************************************************************** Variável com PID do comando $! e $$ Quando tem o & no fim da linha, a seguinte vai ser executada imediatamente, entre estas linhas pode pegar o $! que é o PID deste comando $! retorna o PID do ultimo comando. $! é o PID do ultimo processo executado em background Qualquer comando executado retorna o seu PID na variável $! mantendo sempre o PID do ultimo comando. comando_ou_script & PID=$! mostrar o numero do pid echo $! ou comando & PID=$! echo $PID em script para aguardar o termino da tarefa pode usar wait comando1 & PID=$! wait $PID comando2 & Onde wait $PID fica aguardando o termino de comando1 para depois executar comando2 ******************************************************************** saber qual shell em uso echo $SHELL /bin/bash ******************************************************************** ******************************************************************* Criar variável com parte de outra variável PROCESSOS="1506 1518 2531" echo $PROCESSOS 1506 1518 2531 MVAR2=`echo $PROCESSOS | cut -d' ' -f1` 1506 Contar quantos processos foram encontrados, quantas palavras MQTDE=`echo $PROCESSOS | wc -w` ******************************************************************* Alguns exemplos para pegar parte especifica do resultado em variáveis. Existem diversas maneiras, segue alguns exemplos para sua escolha. Para ver o resultado execute: echo $MVAR Pegar somente o numero de linhas do arquivo. MVAR=`cat arquivo.txt | wc -l` MVAR=`wc -l "arquivo.txt" | cut -d' ' -f1` MVAR=$(wc -l arquivo.txt | awk '{print $1}') Com tr removendo eventuais espaços duplicados MVAR=`wc -l arquivo.txt | tr -s ' ' | cut -d" " -f1` ******************************************************************** Date: Wed, 24 Sep 2003 14:30:56 -0300 From: David de Souza Subject: Re: (linux-br)RegistrandoVariável To: linux-br@bazar2.conectiva.com.br Message-ID: <20030924143056.71ebd37f.dvdsouza@yahoo.com> Content-Type: text/plain; charset="iso-8859-1" Em Wed, 24 Sep 2003 00:35:09 -0300 "Conrado Brocco Tramontini" escreveu: > Cara, para registrar a variável você pode defini-la no /etc/profile > $VARIAVEL = valor > export VARIAVEL > > só que não sei como lista-las. > > > Pessoal, > > > > Como faço para registrar uma variável na inicialização do Linux de > > forma que ela fique disponível para todos os usuários ??? > > > > Como faço para listar todas as variáveis que estão registradas??    O nome da variável não deve ser precedido de "$" quando da atribuição de valores, nao pode haver espaços em torno do "=" e valores atribuídos que contenham espaços devem ser envolvidos por haspas duplas ou simples.  Por exemplo, os seguintes comandos são válidos:    MINHA_VARIAVEL_01=valor    MINHA_VARIAVEL_02="valor com espacos"    MINHA_VARIAVEL_03='outro valor com espacos'    export MINHA_VARIAVEL_01 MINHA_VARIAVEL_02 MINHA_VARIAVEL_03    O "export" também pode ser feito durante a atribuição:    export MINHA_VARIAVEL_01=valor    export MINHA_VARIAVEL_02="valor com espacos"    export MINHA_VARIAVEL_03='outro valor com espacos'    Vale lembrar que esse "registro" somente vale para a sessão shell corrente.  Alterações feitas em valores de variáveis em uma sessão não afetam outras.  Existe uma maneira de evitar alterações subsequentes em valores de variáveis: basta defini-las com diretiva "readonly":    readonly export MINHA_VARIAVEL_01=valor    readonly export MINHA_VARIAVEL_02="valor com espacos"    readonly export MINHA_VARIAVEL_03='outro valor com espacos'    Para listar todo o ambiente, usa-se o comando "set" ou o "env" sem parâmetros.    Veja mais detalhes em    man bash    man set    man env -- :: David de Souza ******************************************************************** De: crg Para: Lúcio Dalmas - CPD , Linux-br Assunto: Re: (linux-br) Setar variáveis...... Data: 14 Jun 2003 09:40:51 -0300 Em Quinta 12 Junho 2003 17:28, Lúcio Dalmas - CPD escreveu: > Desculpem pela pergunta mas gostaria de saber em qual arquivo eu seto > variáveis de Ambiente se ser no $HOME/.bash_profile > para que sirva para todos os usuários?!!?!? /etc/bashrc ou /etc/profile dependendo do que voce quer fazer. -- ******************************************************************** De:  Mauricio Mori Para:  fred_madeira@terra.com.br, Linux - BR Assunto:  Re: (linux-br)Registrando Vari=?ISO-8859-1?B?4Q==?=vel Data:  Wed, 24 Sep 2003 15:53:51 -0300 Fred, o lugar correto para "setar" variáveis no Linux para todos usuários é no arquivo /etc/profile. e o comando eh o export (ex.# export test=220) (se vc der um) # echo $test (vai ter sua variavel como resposta) 220 mauricio mori ******************************************************************** De:  William N. Zanatta Responder-a:  dl-forum@yahoogrupos.com.br Para:  dl-forum@yahoogrupos.com.br Assunto:  Re: [dl-forum] if Data:  Fri, 9 Jan 2004 14:20:04 -0200 (BRST)   if [ -d "${DIRETORIO_HOME}" ]; then     mkdir /home/alunos   fi   --   recomendo a leitura do advanced bash scripting guide...   www.tldp.org   william On Fri, 9 Jan 2004, João Hueder da Silva wrote: > onde esta errado ai ???? > > DIRETORIO_HOME="/home/alunos" > > if [ -d $DIRETORIO_HOME ]; then >    mkdir /home/alunos > fi > > Valeu galera !!! ******************************************************************** De:  William N. Zanatta Responder-a:  dl-forum@yahoogrupos.com.br Para:  dl-forum@yahoogrupos.com.br Assunto:  Re: [dl-forum] if Data:  Fri, 9 Jan 2004 14:43:00 -0200 (BRST)   ahhh usa um ! na frente...   if [ ! -d "${DIRETORIO_HOME}" ]; then      mkdir /home/alunos   fi   william On Fri, 9 Jan 2004, João Hueder da Silva wrote: > mas se eu fizer deste jeito eu não vou estar falando que se existir o > diretorio então crie ??? > > como fasso para, quando não existir então criar ??? ******************************************************************** De:  Andre Luiz Para:  linux-br@bazar2.conectiva.com.br Assunto:  Re: (linux-br)comandos do backup Data:  Tue, 13 Jan 2004 08:21:58 -0900 Fala ae... blz? A variavel eh: $? Geralmente comandos executados com sucesso retornam 0 e comandos executado sem sucesso retornam 1. Boa sorte. On Mon, 12 Jan 2004 17:28:51 -0300 Roberto Wiest wrote: > Olá..... > >     Sou iniciante ,,, preciso saber se um comando quando executado com > sucesso ou nao é armazenado um valor em alguma variavel. deixa eu > explicar melhor, joguei um comando para uma variavel se essa variavel ou > comando for executado com sucesso executa outro comando. tenho > emplementado em um script de backup.; como posso fazer isso. ******************************************************************** De:  Thiago Macieira Para:  linux-br@bazar2.conectiva.com.br Assunto:  Re: (linux-br)comandos do backup Data:  Tue, 13 Jan 2004 13:09:59 -0200 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Robinson Vieira wrote: >Checa a variável de ambiente $?, se for positiva é pq o comando > executou com sucesso. > >> Olá..... >> >>     Sou iniciante ,,, preciso saber se um comando quando executado >> com sucesso ou nao é armazenado um valor em alguma variavel. deixa >> eu explicar melhor, joguei um comando para uma variavel se essa >> variavel ou comando for executado com sucesso executa outro comando. >> tenho emplementado em um script de backup.; como posso fazer isso. É o contrário: se for 0 executou com sucesso. Qualquer valor diferente de zero indica erro na execução. $ true; echo $? 0 $ false; echo $? 1 - --   Thiago Macieira  -  Registered Linux user #65028    thiagom (AT) mail (dot) com     ICQ UIN: 1967141 ******************************************************************** De:  Artur Coutinho Para:  linux-br@bazar2.conectiva.com.br Assunto:  Re: (linux-br)comandos do backup Data:  Tue, 13 Jan 2004 22:40:54 -0200 Em Seg 12 Jan 2004 18:28, Roberto Wiest escreveu: ...  ,,, preciso saber se um comando quando executado com > sucesso ou nao é armazenado um valor em alguma variavel. deixa eu > explicar melhor, joguei um comando para uma variavel se essa variavel ou > comando for executado com sucesso executa outro comando. tenho > emplementado em um script de backup.; como posso fazer isso. Olá Roberto, Você pode usar os caracteres && ao final do comando que será executado primeiro e os próximos comandos só serão executados caso o primeiro tenha sido concluído com sucesso. Veja um exemplo simples abaixo: $ cd  diretório_que_existe  &&  ls Deve retornar a listagem dos arquivos do diretório_que_existe. Caso esse tal diretório não exista (estranho, não?), não será listado nada, e uma mensagem de erro aparecerá. No exemplo acima, foram usados apenas dois comandos em sequência, mas podem ser mais, basta acrescentar && ao final de cada comando que deve ser verificado antes de executar o seguinte. Como você está usando shell script, acredito que isto lhe poupe o trabalho de verificar se cada comando foi executado com sucesso. Sds, -- Artur de Paula Coutinho - Santa Rita do Sapucai - MG www.meusitelinux.cjb.net - arturcoutinho@bol.com.br    Linux Registered User# 140972 - ICQ 59870067 ******************************************************************** De:  Marcio Merlone Para:  Davinio Ross , linux-br@bazar2.conectiva.com.br Assunto:  Re: (linux-br)Qual comando que equivale ao errorlevel do DOS. Data:  Fri, 19 Mar 2004 14:09:48 -0300 echo $? logo após o comando. 0 = sem erros, outros valores indicam algum erro ou situação imprevista. Tem que consultar a documentação de cada comando/programa para saber o significado de cada código. [ ]´s ----- Original Message ----- From: "Davinio Ross" To: Sent: Thursday, March 18, 2004 4:15 PM Subject: (linux-br)Qual comando que equivale ao errorlevel do DOS. Como posso testar se um comando do linux retornou um erro, semelhante ao errorlevel do DOS. ******************************************************************** De:  Carlos Carvalho Para:  linux-br@bazar2.conectiva.com.br Assunto:  RE: (linux-br)problema substring em string com espaco em branco Data:  Mon, 13 Sep 2004 14:42:04 -0300 Nao entendi exatamente o ue voce quer, mas ai vai: [user@machine ~]$ stringZ=$(echo "luiz fernando"|sed s/" "//g) [user@machine ~]$ echo `expr substr $stringZ 1 2` lu [user@machine ~]$ Dessa forma o resultado eh o mesmo quando stringZ="luiz fernando".  '>'ola,  '>'  '>'na verdade o problema esta com o espaco em branco... como reolvo isso  '>'  '>'#/bin/bash  '>'  '>'stringZ="luiz fernando"  '>'  '>'echo `expr substr $stringZ 1 2`  '>'  '>'Dessa forma da syntax error mas se for  '>'  '>'stringZ="luizfernando"  '>'  '>'dai funciona... mas eu preciso levar em conta os espaços em branco da linha...  '>'  '>'Obrigado,  '>'Luiz Fernando   ******************************************************************** De:  Accenture_Luiz_Estivalet@Dell.com Para:  linux-br@bazar2.conectiva.com.br Assunto:  (linux-br)bash substring nao funciona!?! Data:  Mon, 13 Sep 2004 09:56:04 -0300 Ola, Estou tentando rodar um exemplo que achei nesse link: http://www.faqs.org/docs/abs/HTML/string-manipulation.html #!/bin/bash stringZ=abcABC123 echo ${stringZ:1} Esta me retornando o seguinte erro: Syntax error: Bad substitution Qual o problema? Obrigado, Luiz Fernando De:  Carlos Carvalho Para:  linux-br@bazar2.conectiva.com.br Assunto:  RE: (linux-br)bash substring nao funciona!?! Data:  Mon, 13 Sep 2004 10:39:38 -0300 [user@machine ~]$ cat teste #!/bin/bash stringZ=abcABC123 echo ${stringZ:1} [user@machine ~]$ ./teste bcABC123 [user@machine ~]$ Aqui rodou na boa.  '>'Ola,  '>'  '>'Estou tentando rodar um exemplo que achei nesse link:  '>'  '>'http://www.faqs.org/docs/abs/HTML/string-manipulation.html  '>'  '>'#!/bin/bash  '>'  '>'stringZ=abcABC123  '>'echo ${stringZ:1}  '>'  '>'Esta me retornando o seguinte erro: Syntax error: Bad substitution  '>'  '>'Qual o problema? De:  Thiago Macieira Para:  linux-br@bazar2.conectiva.com.br Assunto:  Re: (linux-br)problema substring em string com espaco em branco Data:  Mon, 13 Sep 2004 19:26:10 -0300 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Accenture_Luiz_Estivalet@Dell.com wrote: >#/bin/bash >stringZ="luiz fernando" >echo `expr substr $stringZ 1 2` Aprenda a usar "": $ stringZ="luiz fernando" $ echo `expr substr $stringZ 1 2` expr: syntax error $ echo `expr substr "$stringZ" 1 2` lu Vamos a outro exemplo: $ stringZ="*" $ echo $stringZ [uma linha com um monte de nomes de arquivos suprimida] $ echo "$stringZ" * $ stringZ="-e a" $ echo $stringZ a $ echo "$stringZ" - -e a Imagine se stringZ fosse "-rf /" e você executasse rm $stringZ ao invés de rm -- "$stringZ" - --   Thiago Macieira  -  Registered Linux user #65028    thiago (AT) macieira (DOT) info     ICQ UIN: 1967141   PGP/GPG: 0x6EF45358; fingerprint: ******************************************************************** De:  Thiago Macieira Para:  linux-br@bazar2.conectiva.com.br Assunto:  Re: (linux-br)ainda questao de espacos em branco Data:  Tue, 14 Sep 2004 12:54:04 -0300 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Accenture_Luiz_Estivalet@Dell.com wrote: >#!/bin/bash > >stringZ="luiz  fernando" >echo $stringZ > >quando rodo o script acima, aparece "luiz fernando" somente com um espaco > em branco, mas na string original existem 2 espaços... e estou usando > aspas... alguem sabe por que? Porque você escreveu         echo $stringZ ao invés de         echo "$stringZ" Experimente rodar:         echo a                     b ou ainda:         ls /etc                /boot faz diferença o número de espaços? Resumindo este email e o outro: use " " para que a sua variável seja passada como um *único* parâmetro. Se você não usar, os espaços que a sua variável tiver vão delimitar mais de um parâmetro: $ test -z /; echo $? 1 $ test "-z /"; echo $? 0 $ stringZ="-z /" $ test $stringZ ; echo $? 1 $ test "$stringZ" ; echo $? 0 $ stringZ="- " $ ls $stringZ ls: -: Arquivo ou diretório não encontrado $ ls "$stringZ" ls: opção inválida -- Try `ls --help' for more information. Vê a diferença agora? - --   Thiago Macieira  -  Registered Linux user #65028    thiago (AT) macieira (DOT) info     ICQ UIN: 1967141   PGP/GPG: 0x6EF45358; fingerprint:     E067 918B B660 DBD1 105C  966C 33F5 F005 6EF4 5358 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.5 (GNU/Linux) ******************************************************************** ******************************************************************** ******************************************************************** ********************************************************************