Bash scripting

Bash scripting Bash scripting

Aviso: Este post foi traduzido para o português usando um modelo de tradução automática. Por favor, me avise se encontrar algum erro.

Pasta com scriptslink image 35

Para realizar este post, vamos a criar uma pasta onde vamos guardar todos os scripts

	
!mkdir scripts_bash
Copy

Primeiro scriptlink image 36

Especificação do binário de execuçãolink image 37

Em Linux, pode-se indicar com qual programa executar um arquivo colocando na primeira linha #!<caminho do binário>, por exemplo, se criarmos um .py podemos indicar que deve ser executado com Python colocando na primeira linha #!/usr/bin/python3. No nosso caso, como estamos fazendo um script da terminal, colocamos na primeira linha #!/bin/bash.

Agora, se forem concedidas permissões de execução ao arquivo, ele pode ser executado diretamente sem indicar o programa com o qual deve ser executado. Isso significa que o .py não precisa mais ser executado por meio de python script.py, mas pode ser executado por meio de ./script.py. No nosso caso, em vez de executar o arquivo por meio de bash script.sh, podemos executá-lo por meio de ./script.sh.

Comentários em scripts de bashlink image 38

Se quisermos introduzir um comentário bastaria começar a linha com #.

# Isto é um comentário de uma única linha

Se quisermos introduzir várias linhas de comentários temos que começar com :# e terminar com #

': '
Este é um comentário de várias linhas
que se estende através de várias linhas.
''

Imprimir na tela com o comando echo

Se quisermos imprimir na tela, usamos o comando echo seguido do que queremos imprimir.

	
%%writefile scripts_bash/01_primerScript.sh
#!/bin/bash
# Comentario de una sola linea
: '
Comentario de varias
lineas
'
echo "Hola mundo"
Copy
	
Writing scripts_bash/01_primerScript.sh

Damos permissões de execução e executamos o script

	
!chmod +x scripts_bash/01_primerScript.sh && ./scripts_bash/01_primerScript.sh
Copy
	
Hola mundo

Declaração de variáveislink image 39

Há dois tipos de variáveis: as variáveis de usuário e as variáveis de ambiente

Para criar uma variável basta declará-la inserindo o nome que quisermos, seguido de = e o valor

Para imprimir o valor de uma variável com echo, é necessário referenciar-se a ela através de $<nome da variável>

echo "Variável = $<nome da variável>"
	
%%writefile scripts_bash/02_variables.sh
#!/bin/bash
opcion=1
nombre="Juan"
echo "Opcion: $opcion"
echo "Nombre: $nombre"
Copy
	
Writing scripts_bash/02_variables.sh
	
!chmod +x scripts_bash/02_variables.sh && ./scripts_bash/02_variables.sh
Copy
	
Opcion: 1
Nombre: Juan

Âmbito das variáveis

As variáveis criadas só são acessíveis a partir do script, ou seja, seu escopo é dentro do script.

Exportação de variáveislink image 40

Podemos exportar variáveis para que estejam acessíveis por outros scripts. Para isso, primeiro exportamos a variável usando o comando export e, dentro do script, executamos o segundo script ao qual queremos passar a variável.

	
%%writefile scripts_bash/02_variables.sh
#!/bin/bash
opcion=1
nombre="Juan"
echo "Opcion: $opcion"
echo "Nombre: $nombre"
# Exportar variable nombre
echo "export nombre=$nombre"
export nombre
# Ejecutar script de importacion
echo ""
echo "Ejecutando script de importacion"
./scripts_bash/02_variables_importacion.sh
Copy
	
Overwriting scripts_bash/02_variables.sh
	
%%writefile scripts_bash/02_variables_importacion.sh
#!/bin/bash
echo "Nombre importado: $nombre"
Copy
	
Writing scripts_bash/02_variables_importacion.sh
	
!chmod +x scripts_bash/02_variables.sh && chmod +x scripts_bash/02_variables_importacion.sh && ./scripts_bash/02_variables.sh
Copy
	
Opcion: 1
Nombre: Juan
export nombre=Juan
Ejecutando script de importacion
Nombre importado: Juan

O segundo script deve ser executado dentro do primeiro script. Se agora executarmos o segundo script, não teremos a variável

	
!chmod +x scripts_bash/02_variables_importacion.sh && ./scripts_bash/02_variables_importacion.sh
Copy
	
Nombre importado:

Se quisermos que seja acessível de qualquer segundo script, sem ter que executá-lo dentro do primeiro script, temos que exportar a variável para uma variável de ambiente.

Tipos de operadoreslink image 41

A seguir, mostramos todos os possíveis operadores

	
%%writefile scripts_bash/03_operadores.sh
#!/bin/bash
# Asignación de variables
x=10
y=20
echo "x = $x"
echo "y = $y"
# Operadores aritméticos
echo ""
echo "Operadores aritméticos"
echo "x + y = $((x + y))"
echo "x - y = $((x - y))"
echo "x * y = $((x * y))"
echo "x / y = $((x / y))"
echo "x % y = $((x % y))"
# Operadores de comparación
echo ""
echo "Operadores de comparación"
if [ "$x" -eq "$y" ]; then
echo "x es igual a y"
else
echo "x no es igual a y"
fi
if [ "$x" -ne "$y" ]; then
echo "x no es igual a y"
else
echo "x es igual a y"
fi
if [ "$x" -lt "$y" ]; then
echo "x es menor que y"
else
echo "x no es menor que y"
fi
if [ "$x" -gt "$y" ]; then
echo "x es mayor que y"
else
echo "x no es mayor que y"
fi
# Operadores de cadena
echo ""
echo "Operadores de cadena"
if [ "$a" = "$b" ]; then
echo "a es igual a b"
else
echo "a no es igual a b"
fi
if [ "$a" != "$b" ]; then
echo "a no es igual a b"
else
echo "a es igual a b"
fi
if [ -z "$a" ]; then
echo "a es una cadena vacía"
else
echo "a no es una cadena vacía"
fi
if [ -n "$a" ]; then
echo "a no es una cadena vacía"
else
echo "a es una cadena vacía"
fi
# Operadores de archivo
echo ""
echo "Operadores de archivo"
if [ -e "/path/to/file" ]; then
echo "El archivo existe"
else
echo "El archivo no existe"
fi
if [ -f "/path/to/file" ]; then
echo "Es un archivo regular"
else
echo "No es un archivo regular"
fi
if [ -d "/path/to/dir" ]; then
echo "Es un directorio"
else
echo "No es un directorio"
fi
Copy
	
Overwriting scripts_bash/03_operadores.sh
	
!chmod +x scripts_bash/03_operadores.sh && ./scripts_bash/03_operadores.sh
Copy
	
x = 10
y = 20
Operadores aritméticos
x + y = 30
x - y = -10
x * y = 200
x / y = 0
x % y = 10
Operadores de comparación
x no es igual a y
x no es igual a y
x es menor que y
x no es mayor que y
Operadores de cadena
a es igual a b
a es igual a b
a es una cadena vacía
a es una cadena vacía
Operadores de archivo
El archivo no existe
No es un archivo regular
No es un directorio

Passagem de argumentoslink image 42

É possível passar argumentos para os scripts, uma vez dentro do script podemos utilizá-los da seguinte maneira

  • Por número de argumento: neste caso serão nomeados como $1, $2, etc. Mas no caso de o número de argumentos ser maior que 9, ou seja, quando forem necessários mais de 2 dígitos para nomeá-los, nesse caso o número será identificado entre chaves, ${1}, ${2}, ..., ${10}, ${11}, etc
  • Se o argumento for chamado $0, estamos obtendo o nome do arquivo
  • Se quisermos todos os argumentos, fazemo-lo através de $*
  • Se quisermos o número de argumentos que temos, obtemos através de $#* Se quisermos saber a saída do último comando, podemos fazê-lo através de $?
  • Se quisermos saber o PID do script, podemos saber através de $$
  • Podemos substituir o valor de uma string de um argumento mediante ${<índice do argumento>/string que se quer substituir/nova string}, ou seja, se tivermos ${1/olá/hello} substituirá a palavra olá pela palavra hello no argumento 1
  • No entanto, se usarmos ${<índice do argumento>/#cadeia a ser substituída/nova cadeia}, apenas substituirá a cadeia no argumento se este começar com ess
	
%%writefile scripts_bash/04_argumentos.sh
#!/bin/bash
# Pasos de argumentos simples
echo "Primer argumento: $1"
echo "Segundo argumento: $2"
echo "Tercer argumento: $3"
# Accediendo a todos los argumentos
echo "Todos los argumentos: $*"
# Accediendo al número de argumentos
echo "Número de argumentos: $#"
# Accediendo al nombre del script
echo "Nombre del script: $0"
# Accediendo al código de salida del último comando ejecutado
echo "Código de salida del último comando: $?"
# Accediendo al PID del script
echo "PID del script: $$"
# Accediendo a los argumentos con índices
echo "Argumento 3: ${3}"
echo "Argumento 2: ${2}"
# Accediendo a los argumentos con índices y longitud máxima
echo "Argumento 3 con longitud máxima de 2 caracteres: ${3:0:2}"
echo "Argumento 2 con longitud máxima de 3 caracteres: ${2:0:3}"
# Reemplazando argumentos con índices y longitud máxima
echo "Reemplazando argumento 3: ${3/arg/ARG}"
echo "Reemplazando argumento 2: $ {2/arg/ARG}"
# Accediendo a los argumentos con índices y patrones de reemplazo
echo "Reemplazando patrón en argumento 3: ${3/#tercer/TERCER}"
echo "Reemplazando patrón en argumento 2: ${2/#arg/ARG}"
Copy
	
Overwriting scripts_bash/04_argumentos.sh
	
!arg1="primer argumento" && arg2="segundo argumento" && arg3="tercer argumento" && chmod +x scripts_bash/04_argumentos.sh && ./scripts_bash/04_argumentos.sh "$arg1" "$arg2" "$arg3"
Copy
	
Primer argumento: primer argumento
Segundo argumento: segundo argumento
Tercer argumento: tercer argumento
Todos los argumentos: primer argumento segundo argumento tercer argumento
Número de argumentos: 3
Nombre del script: ./scripts_bash/04_argumentos.sh
Código de salida del último comando: 0
PID del script: 11644
Argumento 3: tercer argumento
Argumento 2: segundo argumento
Argumento 3 con longitud máxima de 2 caracteres: te
Argumento 2 con longitud máxima de 3 caracteres: seg
Reemplazando argumento 3: tercer ARGumento
Reemplazando argumento 2: segundo ARGumento
Reemplazando patrón en argumento 3: tercer argumento
Reemplazando patrón en argumento 2: segundo argumento

Executar comandos e salvá-los em uma variávellink image 43

Temos duas maneiras de executar um comando e salvar sua saída em uma variável

  • Através de variable=command* Através de variable=$(command)
	
%%writefile scripts_bash/05_variables_comandos.sh
#!/bin/bash
path=$(pwd)
infokernel=`uname -a`
echo "El directorio actual es: $path"
echo "La información del kernel es: $infokernel"
Copy
	
Overwriting scripts_bash/05_variables_comandos.sh
	
!chmod +x scripts_bash/05_variables_comandos.sh && ./scripts_bash/05_variables_comandos.sh
Copy
	
El directorio actual es: /home/wallabot/Documentos/web/portafolio/posts
La información del kernel es: Linux wallabot 5.15.0-57-generic #63~20.04.1-Ubuntu SMP Wed Nov 30 13:40:16 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

Depuraçãolink image 44

Há duas maneiras de depurar em bash scripting

  • Usando -v: Execução detalhada de um script linha por linha* Usando -x: Exibição de informações do script
	
!bash -v scripts_bash/05_variables_comandos.sh
Copy
	
#!/bin/bash
path=$(pwd)
infokernel=`uname -a`
echo "El directorio actual es: $path"
El directorio actual es: /home/wallabot/Documentos/web/portafolio/posts
echo "La información del kernel es: $infokernel"
La información del kernel es: Linux wallabot 5.15.0-57-generic #63~20.04.1-Ubuntu SMP Wed Nov 30 13:40:16 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
	
!bash -x scripts_bash/05_variables_comandos.sh
Copy
	
++ pwd
+ path=/home/wallabot/Documentos/web/portafolio/posts
++ uname -a
+ infokernel='Linux wallabot 5.15.0-57-generic #63~20.04.1-Ubuntu SMP Wed Nov 30 13:40:16 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux'
+ echo 'El directorio actual es: /home/wallabot/Documentos/web/portafolio/posts'
El directorio actual es: /home/wallabot/Documentos/web/portafolio/posts
+ echo 'La información del kernel es: Linux wallabot 5.15.0-57-generic #63~20.04.1-Ubuntu SMP Wed Nov 30 13:40:16 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux'
La información del kernel es: Linux wallabot 5.15.0-57-generic #63~20.04.1-Ubuntu SMP Wed Nov 30 13:40:16 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

Obter informações do usuáriolink image 45

Obter informações usando os comandos echo e read

Temos três maneiras de obter informações do usuário

  • Com o comando echo -n. Com a flag -n indicamos que não queremos que seja impressa uma quebra de linha no final do echo. Por exemplo, echo -n "Introduza dado: ", com este comando solicitamos um dado e o cursor permanecerá na mesma linha, sem uma quebra.
  • Através do comando read. Com este comando, o programa ficará esperando que o usuário insira dados terminando com uma quebra de linha. O que foi inserido será armazenado na variável REPLY. Se você quiser que a variável onde os dados inseridos pelo usuário sejam armazenados tenha outro nome, deve-se inserir read [variável], por exemplo o comando read minhaVariavel, armazenará o dado do usuário na variável minhaVariavel
  • Através do comando $REPLY ou $(variável) acessamos os dados inseridos pelo usuário.
	
%%writefile scripts_bash/06_leer_informacion.sh
#!/bin/bash
option=0
backupName=""
echo "Programa de utilidades"
echo -n "Ingresar una opción: "
read
option=$REPLY
echo ""
echo -n "Ingresar un nombre: "
read backupName
echo ""
echo "Opción: $option, backupName: $backupName"
Copy
	
Overwriting scripts_bash/06_leer_informacion.sh

Como em um jupyter notebook não posso inserir os dados conforme me são solicitados, eu os insiro antes em um pipe |

	
!chmod +x scripts_bash/06_leer_informacion.sh && echo "1 nombreprueba" | ./scripts_bash/06_leer_informacion.sh
Copy
	
Programa de utilidades
Ingresar una opción:
Ingresar un nombre:
Opción: 1, backupName: nombreprueba

Obter informações apenas com o comando read

Outra forma de obter informações é usar apenas o comando read, a sintaxe seria

`read -p "Mensagem de prompt:" [variável]`

A bandeira -p indica que a mensagem Prompt message: será exibida antes de aguardar a entrada do usuário. Se não for especificado um nome de variável, o dado será armazenado na variável REPLY.

	
%%writefile scripts_bash/06_leer_informacion.sh
#!/bin/bash
option=0
backupName=""
echo "Programa de utilidades"
echo -n "Ingresar una opción: "
read
option1=$REPLY
echo ""
echo -n "Ingresar un nombre: "
read backupName
echo ""
read -p "Ingresar otra opción: " option2
echo ""
echo "Opción: $option1-$option2, backupName: $backupName"
Copy
	
Overwriting scripts_bash/06_leer_informacion.sh
	
!chmod +x scripts_bash/06_leer_informacion.sh && echo "1 nombreprueba 2" | ./scripts_bash/06_leer_informacion.sh
Copy
	
Programa de utilidades
Ingresar una opción:
Ingresar un nombre:
Opción: 1-2, backupName: nombreprueba

Validar a informação do usuáriolink image 46

Para validar a informação do usuário, o melhor seria usar expressões regulares. Aqui deixo um post onde as explico.

Além disso, podemos especificar o número de caracteres que queremos que o usuário insira quando usamos read. Para isso, usamos a flag -n, que, se não for seguida por nenhum número, aguardará até que o usuário insira uma quebra de linha. Se for seguida por um número, aguardará até que o usuário insira esse número de caracteres.

	
%%writefile scripts_bash/07_validar_informacion.sh
#!/bin/bash
option=0
backupName=""
echo "Programa de utilidades"
echo -n "Ingresar una opción: "
read -n1
option1=$REPLY
echo ""
echo -n "Ingresar un nombre: "
read -n4 backupName
echo ""
read -p "Ingresar otra opción: " option2
echo ""
echo "Opción: $option1-$option2, backupName: $backupName"
Copy
	
Writing scripts_bash/07_validar_informacion.sh
	
!chmod +x scripts_bash/07_validar_informacion.sh && echo "1back2" | ./scripts_bash/07_validar_informacion.sh
Copy
	
Programa de utilidades
Ingresar una opción:
Ingresar un nombre:
Opción: 1-2, backupName: back

Se quisermos que o usuário insira um valor confidencial, como uma chave, usamos a flag -s (segurança). Dessa forma, quando o usuário digitar o dado, ele não será exibido na console.

	
%%writefile scripts_bash/07_validar_informacion.sh
#!/bin/bash
option=0
backupName=""
echo "Programa de utilidades"
echo -n "Ingresar una opción: "
read -n1
option1=$REPLY
echo ""
echo -n "Ingresar un nombre: "
read -n4 backupName
echo ""
read -p "Ingresar otra opción: " option2
echo ""
read -s -p "Password: " password
echo ""
echo "Opción: $option1-$option2, backupName: $backupName, password: $password"
Copy
	
Overwriting scripts_bash/07_validar_informacion.sh
	
!chmod +x scripts_bash/07_validar_informacion.sh && echo "1back2 1234" | ./scripts_bash/07_validar_informacion.sh
Copy
	
Programa de utilidades
Ingresar una opción:
Ingresar un nombre:
Opción: 1-2, backupName: back, password: 1234

Se nãolink image 47

A maneira de escrever condicionais if-else é:

if [[condição]]; then
afirmação
elif [[condição]]; then
declaração
elsedeclaração
fi

É importante ressaltar que as condições devem estar entre dois colchetes [[]]

	
%%writefile scripts_bash/08_if_else.sh
#!/bin/bash
if [[ 1 &gt; 2 ]]; then
echo "Verdadero"
elif [[ 1 &gt; 3 ]]; then
echo "Verdadero"
else
echo "Falso"
fi
Copy
	
Overwriting scripts_bash/08_if_else.sh
	
!chmod +x scripts_bash/08_if_else.sh && ./scripts_bash/08_if_else.sh
Copy
	
Falso

Vamos ver como são criados ifs aninhados

	
%%writefile scripts_bash/08_if_else.sh
#!/bin/bash
if [[ 1 &gt; 2 ]]; then
echo "Verdadero"
elif [[ 1 &gt; 3 ]]; then
echo "Verdadero"
else
if [[ 1 &gt; 4 ]]; then
echo "Verdadero pero falso"
else
echo "Totalmente falso"
fi
fi
Copy
	
Overwriting scripts_bash/08_if_else.sh
	
!chmod +x scripts_bash/08_if_else.sh && ./scripts_bash/08_if_else.sh
Copy
	
Totalmente falso

Expressões condicionaislink image 48

Já vimos como criar ifs, mas é necessário explicar como criar as expressões condicionais

Se vamos a realizar comparações entre cadeias ou strings

operação comando exemplo
maior que `>` [[ cadeia1 > cadeia2 ]]
menor que `<` [[ cadeia1 < cadeia2 ]]
igual que `==` [[ cadeia1 == cadeia2 ]]
igual que `=` [[ cadeia1 = cadeia2 ]]
cadeia vazia `-z` [[ -z cadeia ]]
cadeia não vazia `-n` [[ -n cadeia ]]
cadeia não vazia [[ cadeia ]]

Se o que vamos a fazer é realizar comparações entre números

operação comando exemplo
maior que `-gt` [[ numero1 -gt numero2 ]]
maior ou igual a `-ge` [[ numero1 -ge numero2 ]]
menor que `-lt` `[[ número1 -lt número2 ]]`
menor ou igual a `-le` `[[ número1 -le número2 ]]`
igual que `-eq` `[[ número1 -eq número2 ]]`
diferente de `-ne` `[[ número1 -ne número2 ]]`

Se quisermos verificar arquivos ou diretórios

operação comando exemplo
é um diretório? `-d` [[ -d ]]
é um arquivo? `-f` [[ -f ]]
existe? `-e` [[ -e ]] ou `[[ -e ]]`
é escrevível? `-w` [[ -w ]]
é executável? `-x` [[ -x ]]
é um link? `-L` [[ -L ]]
tem conteúdo? `-s` [[ -s ]]
é propriedade do usuário? `-O` [[ -O ]]
é propriedade do grupo? `-G` [[ -G ]]
foi modificado? `-N` [[ -N ]]
file1 é mais recente que file2? `-nt` [[ -nt ]]
file1 é mais antigo que file2? `-ot` [[ -ot ]]
file1 é o mesmo arquivo que file2? `-ef` [[ -ef ]]
file1 é o mesmo arquivo que file2? `-ef` [[ -ef ]]

Se quisermos comparar condições conjuntas com and, or e not

operação comando exemplo
e `&&` [[ && ]]
ou `

Se quisermos negar as condições

operação comando exemplo
não `!` `[[ ! ]]`
	
%%writefile scripts_bash/09_condicionales.sh
#!/bin/bash
echo "Comparando strings"
string1="hola"
string2="hola"
string3="chao"
string4=""
if [[ $string1 &gt; $string3 ]]; then
echo "$string1 es mayor que $string3"
fi
if [[ $string3 &lt; $string1 ]]; then
echo "$string3 es menor que $string1"
fi
if [[ $string1 == $string2 ]]; then
echo "$string1 es igual que $string2"
fi
if [[ $string1 != $string3 ]]; then
echo "$string1 es diferente que $string3"
fi
if [[ -z $string4 ]]; then
echo "$string4 es una cadena vacía"
fi
if [[ -n $string3 ]]; then
echo "$string3 es una cadena no vacía"
fi
if [[ $string3 ]]; then
echo "$string3 es una cadena no vacía"
fi
echo -e " Comparando números"
number1=10
number2=10
number3=20
if [[ $number3 -gt $number1 ]]; then
echo "$number3 es mayor que $number1"
fi
if [[ $number3 -ge $number2 ]]; then
echo "$number3 es mayor o igual que $number2"
fi
if [[ $number1 -lt $number3 ]]; then
echo "$number1 es menor que $number3"
fi
if [[ $number1 -le $number2 ]]; then
echo "$number1 es menor o igual que $number2"
fi
if [[ $number1 -eq $number2 ]]; then
echo "$number1 es igual que $number2"
fi
if [[ $number1 -ne $number3 ]]; then
echo "$number1 es diferente que $number3"
fi
echo -e " Comparando archivos"
file1="$PWD/2021-02-11-Introduccion-a-Python.ipynb"
file2="$PWD/scripts_bash"
file3="$PWD/mi_paquete_de_python"
if [[ -d $file2 ]]; then
echo "$file2 es un directorio"
fi
if [[ -f $file1 ]]; then
echo "$file1 es un archivo"
fi
if [[ -e $file1 ]]; then
echo "$file1 existe"
fi
if [[ -r $file1 ]]; then
echo "$file1 es legible"
fi
if [[ -w $file1 ]]; then
echo "$file1 es escribible"
fi
if [[ -x $file1 ]]; then
echo "$file1 es ejecutable"
fi
if [[ -L $file1 ]]; then
echo "$file1 es un link"
fi
if [[ -s $file1 ]]; then
echo "$file1 tiene contenido"
fi
if [[ -O $file1 ]]; then
echo "$file1 es propiedad del usuario"
fi
if [[ -G $file1 ]]; then
echo "$file1 es propiedad del grupo"
fi
if [[ -N $file1 ]]; then
echo "$file1 fue modificado"
fi
if [[ $file1 -nt $file2 ]]; then
echo "$file1 es más nuevo que $file2"
fi
if [[ $file1 -ot $file2 ]]; then
echo "$file1 es más viejo que $file2"
fi
if [[ $file1 -ef $file1 ]]; then
echo "$file1 es el mismo archivo que $file2"
fi
echo -e " Comparando expresiones con AND"
if [[ 2 &gt; 1 && 3 &gt; 1 ]]; then
echo "2 &gt; 1 y 3 &gt; 1"
fi
echo -e " Comparando expresiones con OR"
if [[ 2 &gt; 1 || 1 &gt; 2 ]]; then
echo "2 &gt; 1 o 1 &gt; 2"
fi
echo -e " Comparando expresiones con NOT"
if [[ ! 1 &gt; 2 ]]; then
echo "1 &gt; 2 no es cierto"
fi
Copy
	
Overwriting scripts_bash/09_condicionales.sh
	
!chmod +x scripts_bash/09_condicionales.sh && ./scripts_bash/09_condicionales.sh
Copy
	
Comparando strings
hola es mayor que chao
chao es menor que hola
hola es igual que hola
hola es diferente que chao
es una cadena vacía
chao es una cadena no vacía
chao es una cadena no vacía
Comparando números
20 es mayor que 10
20 es mayor o igual que 10
10 es menor que 20
10 es menor o igual que 10
10 es igual que 10
10 es diferente que 20
Comparando archivos
/home/wallabot/Documentos/web/portafolio/posts/scripts_bash es un directorio
/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb es un archivo
/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb existe
/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb es legible
/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb es escribible
/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb tiene contenido
/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb es propiedad del usuario
/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb es propiedad del grupo
/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb es más viejo que /home/wallabot/Documentos/web/portafolio/posts/scripts_bash
/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb es el mismo archivo que /home/wallabot/Documentos/web/portafolio/posts/scripts_bash
Comparando expresiones con AND
2 &gt; 1 y 3 &gt; 1
Comparando expresiones con OR
2 &gt; 1 o 1 &gt; 2
Comparando expresiones con NOT
1 &gt; 2 no es cierto

Sentença case

A seguir, veremos como escrever o típico switch-case, mas neste caso só é usado case.

case $variável in
<valor1>) <sentencia1>;;
<valor2>) <sentencia2>;;
<valor3>) <sentencia3>;;...
*) <declaração que não atende a nenhuma das anteriores>
esac
	
%%writefile scripts_bash/10_case.sh
#!/bin/bash
variable="amarillo"
case $variable in
"rojo") echo "Color rojo";;
"verde") echo "Color verde";;
"azul") echo "Color azul";;
*) echo "Color desconocido";;
esac
Copy
	
Writing scripts_bash/10_case.sh
	
!chmod +x scripts_bash/10_case.sh && ./scripts_bash/10_case.sh
Copy
	
Color desconocido

Arrayslink image 49

Vamos a ver como se comportam os arrays em bash scripting

	
%%writefile scripts_bash/11_arrays.sh
#!/bin/bash
arrayNumeros=(1 2 3 4 5)
arrayStrings=("hola" "chao" "adios")
arrayMixto=(1 "hola" 2 "chao" 3 "adios")
arrayVacio=()
arrayRango=({A..Z})
echo "Arrays"
echo "Array de números: ${arrayNumeros[*]}"
echo "Array de strings: ${arrayStrings[*]}"
echo "Array mixto: ${arrayMixto[*]}"
echo "Array vacío: ${arrayVacio[*]}"
echo "Array de rango: ${arrayRango[*]}"
echo -e " Accediendo a elementos"
echo "Primer elemento del array de números: ${arrayNumeros[0]}"
echo "Segundo elemento del array de strings: ${arrayStrings[1]}"
echo "Último elemento del array de números: ${arrayNumeros[-1]}"
echo "Penúltimo elemento del array de strings: ${arrayStrings[-2]}"
echo -e " Longitud de arrays"
echo "Longitud del array de números: ${#arrayNumeros[*]}"
echo "Longitud del array de strings: ${#arrayStrings[*]}"
echo "Longitud del array mixto: ${#arrayMixto[*]}"
echo "Longitud del array vacío: ${#arrayVacio[*]}"
echo "Longitud del array de rango: ${#arrayRango[*]}"
echo -e " Añadiendo y eliminando elementos"
arrayNumeros[5]=6
echo "Añadiendo elemento al array de números: ${arrayNumeros[*]}"
unset arrayStrings[1]
echo "Eliminando elemento del array de strings: ${arrayStrings[*]}"
Copy
	
Overwriting scripts_bash/11_arrays.sh
	
!chmod +x scripts_bash/11_arrays.sh && ./scripts_bash/11_arrays.sh
Copy
	
Arrays
Array de números: 1 2 3 4 5
Array de strings: hola chao adios
Array mixto: 1 hola 2 chao 3 adios
Array vacío:
Array de rango: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Accediendo a elementos
Primer elemento del array de números: 1
Segundo elemento del array de strings: chao
Último elemento del array de números: 5
Penúltimo elemento del array de strings: chao
Longitud de arrays
Longitud del array de números: 5
Longitud del array de strings: 3
Longitud del array mixto: 6
Longitud del array vacío: 0
Longitud del array de rango: 26
Añadiendo y eliminando elementos
Añadiendo elemento al array de números: 1 2 3 4 5 6
Eliminando elemento del array de strings: hola adios

Laço for

Para utilizar o loop for é necessário usar a seguinte sintaxe

para <variável> em <array>
faça
frase
Entendido. Por favor, proporciona el texto markdown que deseas que traduzca al portugués.

Vamos a ver um exemplo

	
%%writefile scripts_bash/12_for.sh
#!/bin/bash
arrayNumeros=(1 2 3 4 5)
arrayStrings=("hola" "chao" "adios")
echo "Iterar a través de un array de numeros"
for numero in ${arrayNumeros[*]}
do
echo "Número: $numero"
done
echo -e " Iterar a través de un array de strings"
for string in ${arrayStrings[*]}
do
echo "String: $string"
done
echo -e " Iterar a través de un array no declarado"
for string in "Manolo" "Juan" "Pedro"
do
echo "String: $string"
done
echo -e " Iterar a través de un rango"
for i in {1..10}
do
echo "Número: $i"
done
echo -e " Iterar a través de un rango de manera clásica"
for (( i=1; i&lt;=10; i++ ))
do
echo "Número: $i"
done
echo -e " Iterar a través de un comando"
for file in $(ls)
do
echo "Archivo: $file"
done
echo -e " Iterar a través de un directorio"
for file in *
do
echo "Archivo: $file"
done
Copy
	
Overwriting scripts_bash/12_for.sh
	
!chmod +x scripts_bash/12_for.sh && ./scripts_bash/12_for.sh
Copy
	
Iterar a través de un array de numeros
Número: 1
Número: 2
Número: 3
Número: 4
Número: 5
Iterar a través de un array de strings
String: hola
String: chao
String: adios
Iterar a través de un array no declarado
String: Manolo
String: Juan
String: Pedro
Iterar a través de un rango
Número: 1
Número: 2
Número: 3
Número: 4
Número: 5
Número: 6
Número: 7
Número: 8
Número: 9
Número: 10
Iterar a través de un rango de manera clásica
Número: 1
Número: 2
Número: 3
Número: 4
Número: 5
Número: 6
Número: 7
Número: 8
Número: 9
Número: 10
Iterar a través de un comando
Archivo: 2021-02-11-Introduccion-a-Python.ipynb
Archivo: 2021-04-23-Calculo-matricial-con-Numpy.ipynb
Archivo: 2021-06-15-Manejo-de-datos-con-Pandas.ipynb
Archivo: 2022-09-12-Introduccion-a-la-terminal.ipynb
Archivo: 2023-01-22-Docker.ipynb
Archivo: 2023-XX-XX-Bash-scripting.ipynb
Archivo: california_housing_train.csv
Archivo: command-line-cheat-sheet.pdf
Archivo: CSS.ipynb
Archivo: Expresiones
Archivo: regulares.ipynb
Archivo: html_files
Archivo: html.ipynb
Archivo: introduccion_python
Archivo: mi_paquete_de_python
Archivo: movies.csv
Archivo: movies.dat
Archivo: notebooks_translated
Archivo: __pycache__
Archivo: scripts_bash
Archivo: ssh.ipynb
Archivo: test.ipynb
Iterar a través de un directorio
Archivo: 2021-02-11-Introduccion-a-Python.ipynb
Archivo: 2021-04-23-Calculo-matricial-con-Numpy.ipynb
Archivo: 2021-06-15-Manejo-de-datos-con-Pandas.ipynb
Archivo: 2022-09-12-Introduccion-a-la-terminal.ipynb
Archivo: 2023-01-22-Docker.ipynb
Archivo: 2023-XX-XX-Bash-scripting.ipynb
Archivo: california_housing_train.csv
Archivo: command-line-cheat-sheet.pdf
Archivo: CSS.ipynb
Archivo: Expresiones regulares.ipynb
Archivo: html_files
Archivo: html.ipynb
Archivo: introduccion_python
Archivo: mi_paquete_de_python
Archivo: movies.csv
Archivo: movies.dat
Archivo: notebooks_translated
Archivo: __pycache__
Archivo: scripts_bash
Archivo: ssh.ipynb
Archivo: test.ipynb

Laço while

Para utilizar o loop while é necessário usar a seguinte sintaxe

while <condicion>
faça
frase
feito

Vamos a ver um exemplo

	
%%writefile scripts_bash/13_while.sh
#!/bin/bash
numero=1
while [ $numero -ne 5 ]
do
echo "Número: $numero"
numero=$(( numero + 1 ))
done
Copy
	
Overwriting scripts_bash/13_while.sh
	
!chmod +x scripts_bash/13_while.sh && ./scripts_bash/13_while.sh
Copy
	
Número: 1
Número: 2
Número: 3
Número: 4

Controle de fluxo com break e continue

Podemos controlar o fluxo de um loop usando as palavras-chave break e continue. Vamos ver um exemplo:

	
%%writefile scripts_bash/14_control_de_flujo.sh
#!/bin/bash
numero=1
while [ $numero -ne 10 ]
do
if [ $numero -eq 5 ]; then
numero=$(( numero + 1 ))
echo "Saltando el número 5"
continue
elif
[ $numero -eq 8 ]; then
echo "Terminando el bucle"
break
fi
echo "Número: $numero"
numero=$(( numero + 1 ))
done
Copy
	
Overwriting scripts_bash/14_control_de_flujo.sh
	
!chmod +x scripts_bash/14_control_de_flujo.sh && ./scripts_bash/14_control_de_flujo.sh
Copy
	
Número: 1
Número: 2
Número: 3
Número: 4
Saltando el número 5
Número: 6
Número: 7
Terminando el bucle

Funçõeslink image 50

A sintaxe para escrever funções é

``` bash

()

instruções

}```

Vamos ver um exemplo

	
%%writefile scripts_bash/15_funciones.sh
#!/bin/bash
funcion () {
echo "Soy una función"
}
funcoionConParametros () {
echo "Soy una función con parámetros"
echo "Parámetro 1: $1"
echo "Parámetro 2: $2"
}
funcion
funcoionConParametros "Hola" "Adiós"
Copy
	
Writing scripts_bash/15_funciones.sh
	
!chmod +x scripts_bash/15_funciones.sh && ./scripts_bash/15_funciones.sh
Copy
	
Soy una función
Soy una función con parámetros
Parámetro 1: Hola
Parámetro 2: Adiós

Continuar lendo

Últimos posts -->

Você viu esses projetos?

Horeca chatbot

Horeca chatbot Horeca chatbot
Python
LangChain
PostgreSQL
PGVector
React
Kubernetes
Docker
GitHub Actions

Chatbot conversacional para cozinheiros de hotéis e restaurantes. Um cozinheiro, gerente de cozinha ou serviço de quarto de um hotel ou restaurante pode falar com o chatbot para obter informações sobre receitas e menus. Mas também implementa agentes, com os quais pode editar ou criar novas receitas ou menus

Naviground

Naviground Naviground

Subtify

Subtify Subtify
Python
Whisper
Spaces

Gerador de legendas para vídeos no idioma que você desejar. Além disso, coloca uma legenda de cor diferente para cada pessoa

Ver todos os projetos -->

Quer aplicar IA no seu projeto? Entre em contato!

Quer melhorar com essas dicas?

Últimos tips -->

Use isso localmente

Os espaços do Hugging Face nos permitem executar modelos com demos muito simples, mas e se a demo quebrar? Ou se o usuário a deletar? Por isso, criei contêineres docker com alguns espaços interessantes, para poder usá-los localmente, aconteça o que acontecer. Na verdade, se você clicar em qualquer botão de visualização de projeto, ele pode levá-lo a um espaço que não funciona.

Flow edit

Flow edit Flow edit

Edite imagens com este modelo de Flow. Baseado em SD3 ou FLUX, você pode editar qualquer imagem e gerar novas

FLUX.1-RealismLora

FLUX.1-RealismLora FLUX.1-RealismLora
Ver todos os contêineres -->

Quer aplicar IA no seu projeto? Entre em contato!

Você quer treinar seu modelo com esses datasets?

short-jokes-dataset

Dataset com piadas em inglês

opus100

Dataset com traduções de inglês para espanhol

netflix_titles

Dataset com filmes e séries da Netflix

Ver mais datasets -->