Ola 😀
Esta vez amosareiche como facer un guión con condición en Bater, que traducido é:
Se se fai X cousa que quere, faise Y acción, se non se fai entón faise outra acción.
Explicación sinxela non 😀
Agora, pensei durante uns minutos sobre algún exemplo para usar neste tutorial, ocorréuseme o seguinte dilema / problema / situación:
Estamos na rede da nosa empresa e queremos saber se o ordenador X está conectado á rede. Para iso facemos un escrita que fará pingar cara a ese ordenador e se está nunha rede (é dicir, se devolve o pingar) diranos que SI, está na rede, se non (é dicir, non está na rede) diranos que NON está na rede.
Unha vez feito isto, agora explicarei como circular con condicións 🙂
Aquí está o código:
ping -c 1 DIRECCION-IP
if [ $? -ne 0 ]; then
echo "No está en red"
else
echo "Sí está en red"
fi
Non te preocupes, explicareiche isto polo miúdo 😉
pingar é o comando que usaremos e indicaranos se ese PC está na rede. Para dicirlle que PC queremos comprobar se está ou non na rede, debemos cambialo DIRECCIÓN IP por obviamente a dirección IP do PC que queremos comprobar.
Como vedes, poño «-c 1«, Que é necesario para nós. Cando facemos ping a un ordenador, esta acción non se detén (o ping) ata que non nos prememos [Ctrl] + [C], entón poñendo «-c 1»Dixémoslle que faga unha soa verificación (só un intento de ping) e ningunha outra, isto fará que pare instantaneamente, é dicir ... comprobará se o ordenador está na rede só unha vez.
Se tes dúbidas respecto diso, sen dor ... dino e estarei encantado de explicalo de novo 😉
Agora vén o ciclo, porque o que acabo de explicar non é máis que un comando / acción normal 😀
if [ $? -ne 0 ]; then
echo "No está en red"
else
echo "Sí está en red"
fi
Para que entendas isto, explicarei un detalle extremadamente importante de Bash 🙂
O máis coñecedor do tema podería marcarme como mal ou algo así, pero bueno, escribo isto para os novatos ou menos expertos, sempre que o entendan xenial 😉
Sucede que coma en Bater é algo así como 0 y 1, é dicir, ou está vivo ou está morto, cando se executa un comando ou acción: Ou executado ben Sen problema (1), ou había algúns problema ou erro (0).
Levamos a cabo unha acción ou comando X, e o que fixemos pode que se levou a cabo ben ou mal, puido ter un erro ou non, e aquí é onde se atopa o detalle 😉
Se o que mandamos facer (neste caso: ping -c 1 DIRECCIÓN IP) non deu un erro e tivo éxito, polo que devolverá o valor: 1 . Se non, e se a acción (é dicir, o ping) non tivo éxito, devolverá o valor 0.
E, finalmente, o que significa o código anterior é isto:
Se se devolveu o valor 0, entón
Mostrar o texto: «Non na rede»
Se non (e devolver NON 0, pero 1)
Mostrar o texto: «Se está en rede«
Isto que che acabo de explicar serviranos no futuro para moitas cousas, porque é realmente útil poder dicir que se a acción X deu un erro, fai a acción Y e no caso de que a acción X non teña dado erro, deixe a acción Z.
Sei que algúns poden confundirse un pouco, así que tentei explicalo de varias maneiras, intentando que todos o entendan dun xeito ou doutro. Por se alguén queda en dúbida, avísame.
Agora imos facer o noso guión 😀
Debemos seguir os pasos deste tutorial: Bash: como facer un script executable
A continuación copiamos o seguinte código nese ficheiro (guión.sh), e ao final digamos «saír»(Sen as comiñas):
ping -c 1 DIRECCION-IP
if [ $? -ne 0 ]; then
echo "No está en red"
else
echo "Sí está en red"
fi
Debería ter o seguinte aspecto (lembre que deberon cambiar a dirección IP pola IP que desexan):
Aquí podes ver o script en execución:
% CÓDIGO1%
Como vedes, ao final dinos «Si, está en rede»🙂
O importante aquí é que realmente entendan isto das condicións, así que deixo outro código para explicalo de novo, pero desde outro punto de vista.
read "texto"
if [ "$texto" = "3" ]; then
echo "Correcto"
else
echo "Incorrecto"
fi
O que isto significa é sinxelo, deixo a explicación liña por liña:
1a liña: O que escribimos, ese será o valor da variable «mensaxes de texto»(Sen as comiñas).
2a liña: Comprobe se o contido da variable (o que acabamos de escribir) é 3.
3a liña: En caso de selo 3, amosaranos o texto «Corrixa»(Sen as comiñas).
4a liña: Se non (é dicir, por se non escribimos 3).
5a liña: Amosaranos o texto «Incorrecto»(Sen as comiñas).
6a liña: Fin da condición.
Como puideron darse conta, se poñemos perder e despois entre comiñas dobres («) un texto, isto fará que o texto se mostre no terminal. É dicir, se poñemos:
echo "esto es una prueba"
Amosaranos o texto no terminal: esta é unha proba
Pero volvendo a este segundo exemplo, amosareiche a utilidade (e execución) deste segundo guión con algo MOI sinxelo 😀 ... o típico «canto é 1 + 2?«
Déixovos o código do guión completo:
#!/bin/bash
# -*- ENCODING: UTF-8 -*-
echo "¿Cuánto es 1 + 2?"
read "texto"
if [ "$texto" = "3" ]; then
echo "Correcto"
else
echo "Incorrecto"
fi
exit
Aquí está como funciona o guión:
% CÓDIGO2%
E ben ... nada máis que engadir.
Isto é algo elemental, sinxelo si, pero aínda así tentei explicalo o mellor posible, porque non todo o mundo ten a alma dun programador e moitas veces necesitamos facer guións coma estes (ou similares), en calquera caso. espero que este artigo lle sexa útil a alguén 🙂
Calquera dúbida ou pregunta, queixa ou suxestión por favor, déixao aquí, encantado respondereiche e, así, todos aprendemos un pouco máis 😀
lembranzas
26 comentarios, deixa os teus
Es un profesional !!! * ou *
Non por nada 😀
Se che serviu e é interesante, estou satisfeito 😉
Un saúdo amigo
@ KZKG ^ Gaara,
falando de programación bash teño unha pregunta:
Cal é a diferenza entre declarar unha variable coma esta VAR = hola e declarala así VAR = $ {VAR: -hola}?
Explico:
http://pastebin.com/a3cfWXeD
saúdos 😉
Ola 😀
Ben, non son ningún experto en bash ... de feito, non teño nin idea LOL !!
Mentres declaro as variables, é así:
: ${OPTFOLDER:="/opt/"}
Pero como sempre o fixen así, non sei que diferenza podería ser honestamente 🙁
@ KZKG ^ Gaara
Ben, fixen a pregunta porque a verdade é que tampouco o sabía, normalmente escribo SlackBuilds e a verdade é que nestes scripts abundan as variables declaradas como en VAR1. Unha rápida busca en google axudoume a aclarar esta pregunta, compartímola con todos para que todos aprendamos:
Guión:
http://pastebin.com/faAQb35w
Explicación:
Declarar variables do formulario VAR = $ {VAR: -default_value} significa que a variable VAR tomará o valor default_value se e só se o valor é nulo ou non existe.
Exemplo práctico:
Ao executar o script, pídese que introduza un valor para almacenar na variable VAR, se se introduce algo, amosará o que se introduciu. Se non introducimos nada e prememos Intro declararemos a variable VAR como nula, polo tanto, mostra value_default.
Saúdos.
HAHA non o sabía 😀
Ok, moitas grazas amigo ... a iso quería dicir ao final do artigo, non pretendo ensinar algo e xa está, sei que sempre aprenderei algo novo aquí 😀
Un saúdo e grazas unha vez máis.
tes razón, aquí aprendes varias cousas.
saúdos e felices festas !! 😀
Fantástico e excelente +1, o tempo que che levará ...
pero pago a pena o esforzo 😉
En realidade escribín o 80% en só 1 día, tardei moito en publicalo só porque a miña internet non me permitía.
Grazas polo teu comentario 😉
Outro xeito de facelo é usando DNS, xa que ás veces as redes teñen o protocolo ICMP bloqueado:
(host -ta IP-ADDRESS> / dev / null 2> & 1) && echo "Conectado á rede"
Tamén notarás que neste exemplo a comprobación do valor de retorno é implícita 😉
Ti coma sempre amigo, con consellos que non coñezo por completo HAHAHA.
Grazas, o comentario agradécese e jeje ... outra cousa nova que aprendín 😀
grazas
🙂
Aínda que pasaron varios días desde a publicación deste tema, servíume moito, agora que fixen un guión en bash .. Grazas Gaara ..
Doc. Grazas pola axuda que me deixaches claro.
Só unha consulta, como fago para que cando un ordenador deixa de facer ping automaticamente o outro cambie de IP. Teño isto.
para cambiar a IP
#! / bin / bash
ping -c 10 192.168.1.50 # Se non fai ping automaticamente
ifconfig eth0 192.168.1.50 máscara de rede 255.255.255.0 emisión 192.168.1.0
ifconfig eth0 abaixo
ifconfig eth0 arriba
porque cando se compara co se usa o signo de interrogación? que diferenza hai entre poñer o? calquera outra carta
$ significa "a saída ou saída anterior", é dicir, no caso de que o resultado do comando anterior ... 🙂
Hai outro xeito de acadar o mesmo resultado, pasando o comando ping directamente como argumento a se:
se ping -c 1 DIRECCIÓN IP; entón
eco "Si está na rede"
outro
eco "Non está na rede"
fi
O que ocorre é que se avalía o valor devolto do comando que pasa como argumento, se devolve 0 é certo, calquera outra cousa é falsa. Os corchetes son equivalentes ao comando de proba. Pero pode pasar calquera comando como argumento (sempre que o comando devolva algún valor).
Ola, como podo executar un script.sh cun usuario X no script creo un usuario Y, e ese usuario Y segue executando o script.sh
Pódese facer ??
Moi interesante, grazas!
Grazas pola contribución, estiven unha hora en entendelo xD, pero entendino !!!!.
O guión está ben. Aritméticamente, tamén se podería facer como ($? == 0) se é igual a cero non está na rede, se non está na rede. E se aínda queremos facelo un pouco máis interactivo, podemos dicir:
echo -n Introduza a IP:
ler ip
ping -c 1 $ ip
Ola, son moi novo nisto, estou tentando facer un número de ticket (alfanumérico) a través dunha lectura e quero que se o que se introduce ten o formato correcto (ABC-123456) execute un comando "x" e non o fago Non sei como facelo, poderíasme axudar?
eco "Introducir ticket"
billete de lectura -p
se $ ticket = "nin idea (formato ABC-123456"); despois cp file.txt $ ticket; senón fai eco de "formato incorrecto, téntao de novo"; ler -p; fi.
Claro que é horrible e rían jaja, pero como dixen, estou empezando con isto.
Se o explico mal, cóntame e intento facelo mellor.
Abrazo a todos.
Excelente explicación, saúdos
Teño unha pequena dúbida con if, else e outros.
Quero un script para comprobar que existe un ficheiro (un dos rexistros) e se non, para crealo e despois escribir nel. Pero se existe, quero que só lle escribas.
O que teño é:
data = `data -R`
#Estaba probando a data variable, que non se actualiza entre o inicio de a
#proceso e remata, ás veces pode pasar unha hora e non sae a hora correcta.
se [-f /home/user/logs/test.log];
logo
toque /home/usuario/logs/test.log
outro
echo "$ data: Actualizado" >> /home/user/logs/test.log
echo «———————————————-» >> /home/user/logs/test.log
fi
En teoría debería estar ben, pero a realidade é que non se actualiza se xa existe o ficheiro referenciado
perdón, vin que non foi enviado e duplicouse