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 scripts
Para realizar este post, vamos a criar uma pasta onde vamos guardar todos os scripts
!mkdir scripts_bash
Primeiro script
Especificação do binário de execução
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 bash
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 variaslineas'echo "Hola mundo"
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
Hola mundo
Declaração de variáveis
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/bashopcion=1nombre="Juan"echo "Opcion: $opcion"echo "Nombre: $nombre"
Writing scripts_bash/02_variables.sh
!chmod +x scripts_bash/02_variables.sh && ./scripts_bash/02_variables.sh
Opcion: 1Nombre: 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áveis
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/bashopcion=1nombre="Juan"echo "Opcion: $opcion"echo "Nombre: $nombre"# Exportar variable nombreecho "export nombre=$nombre"export nombre# Ejecutar script de importacionecho ""echo "Ejecutando script de importacion"./scripts_bash/02_variables_importacion.sh
Overwriting scripts_bash/02_variables.sh
%%writefile scripts_bash/02_variables_importacion.sh#!/bin/bashecho "Nombre importado: $nombre"
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
Opcion: 1Nombre: Juanexport nombre=JuanEjecutando script de importacionNombre 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
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 operadores
A seguir, mostramos todos os possíveis operadores
%%writefile scripts_bash/03_operadores.sh#!/bin/bash# Asignación de variablesx=10y=20echo "x = $x"echo "y = $y"# Operadores aritméticosecho ""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ónecho ""echo "Operadores de comparación"if [ "$x" -eq "$y" ]; thenecho "x es igual a y"elseecho "x no es igual a y"fiif [ "$x" -ne "$y" ]; thenecho "x no es igual a y"elseecho "x es igual a y"fiif [ "$x" -lt "$y" ]; thenecho "x es menor que y"elseecho "x no es menor que y"fiif [ "$x" -gt "$y" ]; thenecho "x es mayor que y"elseecho "x no es mayor que y"fi# Operadores de cadenaecho ""echo "Operadores de cadena"if [ "$a" = "$b" ]; thenecho "a es igual a b"elseecho "a no es igual a b"fiif [ "$a" != "$b" ]; thenecho "a no es igual a b"elseecho "a es igual a b"fiif [ -z "$a" ]; thenecho "a es una cadena vacía"elseecho "a no es una cadena vacía"fiif [ -n "$a" ]; thenecho "a no es una cadena vacía"elseecho "a es una cadena vacía"fi# Operadores de archivoecho ""echo "Operadores de archivo"if [ -e "/path/to/file" ]; thenecho "El archivo existe"elseecho "El archivo no existe"fiif [ -f "/path/to/file" ]; thenecho "Es un archivo regular"elseecho "No es un archivo regular"fiif [ -d "/path/to/dir" ]; thenecho "Es un directorio"elseecho "No es un directorio"fi
Overwriting scripts_bash/03_operadores.sh
!chmod +x scripts_bash/03_operadores.sh && ./scripts_bash/03_operadores.sh
x = 10y = 20Operadores aritméticosx + y = 30x - y = -10x * y = 200x / y = 0x % y = 10Operadores de comparaciónx no es igual a yx no es igual a yx es menor que yx no es mayor que yOperadores de cadenaa es igual a ba es igual a ba es una cadena vacíaa es una cadena vacíaOperadores de archivoEl archivo no existeNo es un archivo regularNo es un directorio
Passagem de argumentos
É 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 palavraolá
pela palavrahello
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 simplesecho "Primer argumento: $1"echo "Segundo argumento: $2"echo "Tercer argumento: $3"# Accediendo a todos los argumentosecho "Todos los argumentos: $*"# Accediendo al número de argumentosecho "Número de argumentos: $#"# Accediendo al nombre del scriptecho "Nombre del script: $0"# Accediendo al código de salida del último comando ejecutadoecho "Código de salida del último comando: $?"# Accediendo al PID del scriptecho "PID del script: $$"# Accediendo a los argumentos con índicesecho "Argumento 3: ${3}"echo "Argumento 2: ${2}"# Accediendo a los argumentos con índices y longitud máximaecho "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áximaecho "Reemplazando argumento 3: ${3/arg/ARG}"echo "Reemplazando argumento 2: $ {2/arg/ARG}"# Accediendo a los argumentos con índices y patrones de reemplazoecho "Reemplazando patrón en argumento 3: ${3/#tercer/TERCER}"echo "Reemplazando patrón en argumento 2: ${2/#arg/ARG}"
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"
Primer argumento: primer argumentoSegundo argumento: segundo argumentoTercer argumento: tercer argumentoTodos los argumentos: primer argumento segundo argumento tercer argumentoNúmero de argumentos: 3Nombre del script: ./scripts_bash/04_argumentos.shCódigo de salida del último comando: 0PID del script: 11644Argumento 3: tercer argumentoArgumento 2: segundo argumentoArgumento 3 con longitud máxima de 2 caracteres: teArgumento 2 con longitud máxima de 3 caracteres: segReemplazando argumento 3: tercer ARGumentoReemplazando argumento 2: segundo ARGumentoReemplazando patrón en argumento 3: tercer argumentoReemplazando patrón en argumento 2: segundo argumento
Executar comandos e salvá-los em uma variável
Temos duas maneiras de executar um comando e salvar sua saída em uma variável
- Através de
variable=command
* Através devariable=$(command)
%%writefile scripts_bash/05_variables_comandos.sh#!/bin/bashpath=$(pwd)infokernel=`uname -a`echo "El directorio actual es: $path"echo "La información del kernel es: $infokernel"
Overwriting scripts_bash/05_variables_comandos.sh
!chmod +x scripts_bash/05_variables_comandos.sh && ./scripts_bash/05_variables_comandos.sh
El directorio actual es: /home/wallabot/Documentos/web/portafolio/postsLa 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ção
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
#!/bin/bashpath=$(pwd)infokernel=`uname -a`echo "El directorio actual es: $path"El directorio actual es: /home/wallabot/Documentos/web/portafolio/postsecho "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
++ 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ário
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 doecho
. 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ávelREPLY
. Se você quiser que a variável onde os dados inseridos pelo usuário sejam armazenados tenha outro nome, deve-se inserirread [variável]
, por exemplo o comandoread minhaVariavel
, armazenará o dado do usuário na variávelminhaVariavel
- Através do comando
$REPLY
ou$(variável)
acessamos os dados inseridos pelo usuário.
%%writefile scripts_bash/06_leer_informacion.sh#!/bin/bashoption=0backupName=""echo "Programa de utilidades"echo -n "Ingresar una opción: "readoption=$REPLYecho ""echo -n "Ingresar un nombre: "read backupNameecho ""echo "Opción: $option, backupName: $backupName"
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
Programa de utilidadesIngresar 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/bashoption=0backupName=""echo "Programa de utilidades"echo -n "Ingresar una opción: "readoption1=$REPLYecho ""echo -n "Ingresar un nombre: "read backupNameecho ""read -p "Ingresar otra opción: " option2echo ""echo "Opción: $option1-$option2, backupName: $backupName"
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
Programa de utilidadesIngresar una opción:Ingresar un nombre:Opción: 1-2, backupName: nombreprueba
Validar a informação do usuário
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/bashoption=0backupName=""echo "Programa de utilidades"echo -n "Ingresar una opción: "read -n1option1=$REPLYecho ""echo -n "Ingresar un nombre: "read -n4 backupNameecho ""read -p "Ingresar otra opción: " option2echo ""echo "Opción: $option1-$option2, backupName: $backupName"
Writing scripts_bash/07_validar_informacion.sh
!chmod +x scripts_bash/07_validar_informacion.sh && echo "1back2" | ./scripts_bash/07_validar_informacion.sh
Programa de utilidadesIngresar 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/bashoption=0backupName=""echo "Programa de utilidades"echo -n "Ingresar una opción: "read -n1option1=$REPLYecho ""echo -n "Ingresar un nombre: "read -n4 backupNameecho ""read -p "Ingresar otra opción: " option2echo ""read -s -p "Password: " passwordecho ""echo "Opción: $option1-$option2, backupName: $backupName, password: $password"
Overwriting scripts_bash/07_validar_informacion.sh
!chmod +x scripts_bash/07_validar_informacion.sh && echo "1back2 1234" | ./scripts_bash/07_validar_informacion.sh
Programa de utilidadesIngresar una opción:Ingresar un nombre:Opción: 1-2, backupName: back, password: 1234
Se não
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/bashif [[ 1 > 2 ]]; thenecho "Verdadero"elif [[ 1 > 3 ]]; thenecho "Verdadero"elseecho "Falso"fi
Overwriting scripts_bash/08_if_else.sh
!chmod +x scripts_bash/08_if_else.sh && ./scripts_bash/08_if_else.sh
Falso
Vamos ver como são criados if
s aninhados
%%writefile scripts_bash/08_if_else.sh#!/bin/bashif [[ 1 > 2 ]]; thenecho "Verdadero"elif [[ 1 > 3 ]]; thenecho "Verdadero"elseif [[ 1 > 4 ]]; thenecho "Verdadero pero falso"elseecho "Totalmente falso"fifi
Overwriting scripts_bash/08_if_else.sh
!chmod +x scripts_bash/08_if_else.sh && ./scripts_bash/08_if_else.sh
Totalmente falso
Expressões condicionais
Já vimos como criar if
s, 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` | [[ |
file1 é mais antigo que file2? | `-ot` | [[ |
file1 é o mesmo arquivo que file2? | `-ef` | [[ |
file1 é o mesmo arquivo que file2? | `-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/bashecho "Comparando strings"string1="hola"string2="hola"string3="chao"string4=""if [[ $string1 > $string3 ]]; thenecho "$string1 es mayor que $string3"fiif [[ $string3 < $string1 ]]; thenecho "$string3 es menor que $string1"fiif [[ $string1 == $string2 ]]; thenecho "$string1 es igual que $string2"fiif [[ $string1 != $string3 ]]; thenecho "$string1 es diferente que $string3"fiif [[ -z $string4 ]]; thenecho "$string4 es una cadena vacía"fiif [[ -n $string3 ]]; thenecho "$string3 es una cadena no vacía"fiif [[ $string3 ]]; thenecho "$string3 es una cadena no vacía"fiecho -e " Comparando números"number1=10number2=10number3=20if [[ $number3 -gt $number1 ]]; thenecho "$number3 es mayor que $number1"fiif [[ $number3 -ge $number2 ]]; thenecho "$number3 es mayor o igual que $number2"fiif [[ $number1 -lt $number3 ]]; thenecho "$number1 es menor que $number3"fiif [[ $number1 -le $number2 ]]; thenecho "$number1 es menor o igual que $number2"fiif [[ $number1 -eq $number2 ]]; thenecho "$number1 es igual que $number2"fiif [[ $number1 -ne $number3 ]]; thenecho "$number1 es diferente que $number3"fiecho -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 ]]; thenecho "$file2 es un directorio"fiif [[ -f $file1 ]]; thenecho "$file1 es un archivo"fiif [[ -e $file1 ]]; thenecho "$file1 existe"fiif [[ -r $file1 ]]; thenecho "$file1 es legible"fiif [[ -w $file1 ]]; thenecho "$file1 es escribible"fiif [[ -x $file1 ]]; thenecho "$file1 es ejecutable"fiif [[ -L $file1 ]]; thenecho "$file1 es un link"fiif [[ -s $file1 ]]; thenecho "$file1 tiene contenido"fiif [[ -O $file1 ]]; thenecho "$file1 es propiedad del usuario"fiif [[ -G $file1 ]]; thenecho "$file1 es propiedad del grupo"fiif [[ -N $file1 ]]; thenecho "$file1 fue modificado"fiif [[ $file1 -nt $file2 ]]; thenecho "$file1 es más nuevo que $file2"fiif [[ $file1 -ot $file2 ]]; thenecho "$file1 es más viejo que $file2"fiif [[ $file1 -ef $file1 ]]; thenecho "$file1 es el mismo archivo que $file2"fiecho -e " Comparando expresiones con AND"if [[ 2 > 1 && 3 > 1 ]]; thenecho "2 > 1 y 3 > 1"fiecho -e " Comparando expresiones con OR"if [[ 2 > 1 || 1 > 2 ]]; thenecho "2 > 1 o 1 > 2"fiecho -e " Comparando expresiones con NOT"if [[ ! 1 > 2 ]]; thenecho "1 > 2 no es cierto"fi
Overwriting scripts_bash/09_condicionales.sh
!chmod +x scripts_bash/09_condicionales.sh && ./scripts_bash/09_condicionales.sh
Comparando stringshola es mayor que chaochao es menor que holahola es igual que holahola es diferente que chaoes una cadena vacíachao es una cadena no vacíachao es una cadena no vacíaComparando números20 es mayor que 1020 es mayor o igual que 1010 es menor que 2010 es menor o igual que 1010 es igual que 1010 es diferente que 20Comparando 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_bashComparando expresiones con AND2 > 1 y 3 > 1Comparando expresiones con OR2 > 1 o 1 > 2Comparando expresiones con NOT1 > 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/bashvariable="amarillo"case $variable in"rojo") echo "Color rojo";;"verde") echo "Color verde";;"azul") echo "Color azul";;*) echo "Color desconocido";;esac
Writing scripts_bash/10_case.sh
!chmod +x scripts_bash/10_case.sh && ./scripts_bash/10_case.sh
Color desconocido
Arrays
Vamos a ver como se comportam os arrays em bash scripting
%%writefile scripts_bash/11_arrays.sh#!/bin/basharrayNumeros=(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]=6echo "Añadiendo elemento al array de números: ${arrayNumeros[*]}"unset arrayStrings[1]echo "Eliminando elemento del array de strings: ${arrayStrings[*]}"
Overwriting scripts_bash/11_arrays.sh
!chmod +x scripts_bash/11_arrays.sh && ./scripts_bash/11_arrays.sh
ArraysArray de números: 1 2 3 4 5Array de strings: hola chao adiosArray mixto: 1 hola 2 chao 3 adiosArray 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 ZAccediendo a elementosPrimer elemento del array de números: 1Segundo elemento del array de strings: chaoÚltimo elemento del array de números: 5Penúltimo elemento del array de strings: chaoLongitud de arraysLongitud del array de números: 5Longitud del array de strings: 3Longitud del array mixto: 6Longitud del array vacío: 0Longitud del array de rango: 26Añadiendo y eliminando elementosAñadiendo elemento al array de números: 1 2 3 4 5 6Eliminando 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/basharrayNumeros=(1 2 3 4 5)arrayStrings=("hola" "chao" "adios")echo "Iterar a través de un array de numeros"for numero in ${arrayNumeros[*]}doecho "Número: $numero"doneecho -e " Iterar a través de un array de strings"for string in ${arrayStrings[*]}doecho "String: $string"doneecho -e " Iterar a través de un array no declarado"for string in "Manolo" "Juan" "Pedro"doecho "String: $string"doneecho -e " Iterar a través de un rango"for i in {1..10}doecho "Número: $i"doneecho -e " Iterar a través de un rango de manera clásica"for (( i=1; i<=10; i++ ))doecho "Número: $i"doneecho -e " Iterar a través de un comando"for file in $(ls)doecho "Archivo: $file"doneecho -e " Iterar a través de un directorio"for file in *doecho "Archivo: $file"done
Overwriting scripts_bash/12_for.sh
!chmod +x scripts_bash/12_for.sh && ./scripts_bash/12_for.sh
Iterar a través de un array de numerosNúmero: 1Número: 2Número: 3Número: 4Número: 5Iterar a través de un array de stringsString: holaString: chaoString: adiosIterar a través de un array no declaradoString: ManoloString: JuanString: PedroIterar a través de un rangoNúmero: 1Número: 2Número: 3Número: 4Número: 5Número: 6Número: 7Número: 8Número: 9Número: 10Iterar a través de un rango de manera clásicaNúmero: 1Número: 2Número: 3Número: 4Número: 5Número: 6Número: 7Número: 8Número: 9Número: 10Iterar a través de un comandoArchivo: 2021-02-11-Introduccion-a-Python.ipynbArchivo: 2021-04-23-Calculo-matricial-con-Numpy.ipynbArchivo: 2021-06-15-Manejo-de-datos-con-Pandas.ipynbArchivo: 2022-09-12-Introduccion-a-la-terminal.ipynbArchivo: 2023-01-22-Docker.ipynbArchivo: 2023-XX-XX-Bash-scripting.ipynbArchivo: california_housing_train.csvArchivo: command-line-cheat-sheet.pdfArchivo: CSS.ipynbArchivo: ExpresionesArchivo: regulares.ipynbArchivo: html_filesArchivo: html.ipynbArchivo: introduccion_pythonArchivo: mi_paquete_de_pythonArchivo: movies.csvArchivo: movies.datArchivo: notebooks_translatedArchivo: __pycache__Archivo: scripts_bashArchivo: ssh.ipynbArchivo: test.ipynbIterar a través de un directorioArchivo: 2021-02-11-Introduccion-a-Python.ipynbArchivo: 2021-04-23-Calculo-matricial-con-Numpy.ipynbArchivo: 2021-06-15-Manejo-de-datos-con-Pandas.ipynbArchivo: 2022-09-12-Introduccion-a-la-terminal.ipynbArchivo: 2023-01-22-Docker.ipynbArchivo: 2023-XX-XX-Bash-scripting.ipynbArchivo: california_housing_train.csvArchivo: command-line-cheat-sheet.pdfArchivo: CSS.ipynbArchivo: Expresiones regulares.ipynbArchivo: html_filesArchivo: html.ipynbArchivo: introduccion_pythonArchivo: mi_paquete_de_pythonArchivo: movies.csvArchivo: movies.datArchivo: notebooks_translatedArchivo: __pycache__Archivo: scripts_bashArchivo: ssh.ipynbArchivo: 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/bashnumero=1while [ $numero -ne 5 ]doecho "Número: $numero"numero=$(( numero + 1 ))done
Overwriting scripts_bash/13_while.sh
!chmod +x scripts_bash/13_while.sh && ./scripts_bash/13_while.sh
Número: 1Número: 2Número: 3Nú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/bashnumero=1while [ $numero -ne 10 ]doif [ $numero -eq 5 ]; thennumero=$(( numero + 1 ))echo "Saltando el número 5"continueelif[ $numero -eq 8 ]; thenecho "Terminando el bucle"breakfiecho "Número: $numero"numero=$(( numero + 1 ))done
Overwriting scripts_bash/14_control_de_flujo.sh
!chmod +x scripts_bash/14_control_de_flujo.sh && ./scripts_bash/14_control_de_flujo.sh
Número: 1Número: 2Número: 3Número: 4Saltando el número 5Número: 6Número: 7Terminando el bucle
Funções
A sintaxe para escrever funções é
``` bash
instruções
}```
Vamos ver um exemplo
%%writefile scripts_bash/15_funciones.sh#!/bin/bashfuncion () {echo "Soy una función"}funcoionConParametros () {echo "Soy una función con parámetros"echo "Parámetro 1: $1"echo "Parámetro 2: $2"}funcionfuncoionConParametros "Hola" "Adiós"
Writing scripts_bash/15_funciones.sh
!chmod +x scripts_bash/15_funciones.sh && ./scripts_bash/15_funciones.sh
Soy una funciónSoy una función con parámetrosParámetro 1: HolaParámetro 2: Adiós