Bash scripting
Pasta com scripts
Este caderno foi traduzido automaticamente para torná-lo acessível a mais pessoas, por favor me avise se você vir algum erro de digitação..
Para fazer este post, vamos criar uma pasta onde vamos salvar todos os scripts.
!mkdir scripts_bash
Primeiro roteiro
Especificação do binário de execução
No linux você pode indicar com qual programa executar um arquivo colocando na primeira linha #!<binary path>
, por exemplo, se criarmos um .py
podemos indicar que ele deve ser executado com python colocando na primeira linha #!/usr/bin/python3
. Em nosso caso, como estamos fazendo um script terminal, colocamos na primeira linha #!/bin/bash
.
Agora, se o arquivo receber permissões de execução, ele pode ser executado diretamente sem especificar o programa com o qual ele deve ser executado. Ou seja, o .py' não precisa mais ser executado via
.py.py', mas pode ser executado via .script.py'. Em nosso caso, em vez de executar o arquivo via
bash script.sh, podemos executá-lo via
./script.sh`.
Comentários em scripts bash
Se você quiser entrar um comentário, basta iniciar a linha com `#``.
"bash
Este é um comentário de uma linha
Se quisermos entrar em várias linhas de comentários, temos que começar com `: `` e terminar com ```.
"bash
: '
Este é um comentário de várias linhas
que se estende por várias linhas.
'
Imprimir na tela com o comando `echo
Se quisermos imprimir na tela, utilizamos o comando echo
seguido pelo que queremos imprimir.
!mkdir scripts_bash%%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
Nós damos permissões de execução e executamos o roteiro
!chmod +x scripts_bash/01_primerScript.sh && ./scripts_bash/01_primerScript.sh
Hola mundo
Declaração variável
Há dois tipos de variáveis, "variáveis de usuário" e "variáveis ambientais".
Para criar uma variável basta declará-la inserindo o nome desejado, seguido por `=`` e o valor
Para imprimir o valor de uma variável com echo
, é necessário referenciá-la com `$<nome variável>.
"bash echo "Variável = $<nome variável>" echo "Variável = $<nome variável>" echo "Variável = $<nome variável>" echo "Variável = $<nome variável>" echo "Variável = $<nome 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ão acessíveis apenas de dentro do roteiro, ou seja, seu escopo está dentro do roteiro.
Exportação de variáveis
Podemos exportar variáveis para que possam ser acessadas por outros scripts, para isso primeiro exportamos a variável utilizando o comando "exportar" e executamos chamada, dentro do script, o segundo script para o 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
Você tem que executar o segundo roteiro dentro do primeiro roteiro. Se agora rodarmos o segundo script, não temos a variável
!chmod +x scripts_bash/02_variables_importacion.sh && ./scripts_bash/02_variables_importacion.sh
Nombre importado:
Se quisermos que ela seja acessível a partir de qualquer segundo script, sem ter que executá-la dentro do primeiro script, temos que exportar a variável para uma variável de ambiente
Tipos de operadores
Todos os operadores possíveis são mostrados abaixo
%%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
Etapa da argumentação
Os argumentos podem ser passados aos roteiros, uma vez dentro do roteiro podemos fazer uso deles da seguinte forma
- Por número de argumento: neste caso serão nomeados como
$1
,$2
, etc. Mas caso o número de argumentos seja superior a 9, ou seja, são necessários mais de 2 dígitos para nomeá-lo, neste caso o número será identificado entre chaves,$1
,$2
, ..., $10, $11, etc. - Se o argumento de $0 for chamado, estamos recebendo o nome do arquivo
- Se quisermos todos os argumentos, o faremos com
$*
. - Se o que queremos é o número de argumentos que temos, o conseguimos por
$#
. - Se quisermos sanear a saída do último comando, podemos descobrir por `$?``.
- Se quisermos saber o
PID
do roteiro, podemos descobri-lo por$$
. - Podemos substituir o valor de uma string em um argumento por
${<índice do documento>/ string a ser substituída/nova string}
, ou seja, se tivermos${1/hello/hello}
substituirá a palavrahello
pela palavrahello
no argumento 1. - Entretanto, se utilizarmos
${< índice do documento>/# string a ser substituído/nova string}
, ele só substituirá a string no argumento se o argumento começar com essa string.
%%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 armazená-los em uma variável
Temos duas maneiras de executar um comando e salvar sua saída em uma variável
- Por variável=
comando
- Através de
variable=$(comando)
.
%%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 ser capaz de depurar no bash scripting
- Utilizando `-v': Execução detalhada linha por linha do script
- Utilizando
-x
: Exibição de informações do roteiro
!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 utilizando os comandos echo
e read
.
Temos duas formas de obter informações do usuário
- com o comando
echo -n
. Com a bandeira-n
indicamos que não queremos que uma quebra de linha seja impressa no final doecho
. Por exemplo, `echo -n "Insira dados:", com este comando pedimos dados e o cursor ficará na mesma linha, não haverá quebra de linha. - utilizando o comando "ler". Com este comando, o programa esperará que o usuário insira os 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 são salvos tenha outro nome, você deve inserirread [variável]
, por exemplo o comandoread myVariable
, salvará os dados do usuário na variávelmyVariable
. - utilizando o 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 não posso inserir os dados em um caderno jupyter como ele pede, coloquei-o em um cano ``` de antemão.
!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 somente através do comando "ler
Outra forma de obter informações é utilizar apenas o comando "ler", a sintaxe seria
"bash leia -p "Mensagem imediata:" [variável].
A bandeira `-p' indica que a mensagem ``Ponto de alerta:` será exibida antes de aguardar a entrada do usuário. Se nenhum nome de variável for especificado, os dados serão armazenados 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 informações do usuário
Para validar as informações do usuário a melhor maneira seria usar expressões regulares, aqui está um post onde eu as explico
Também podemos especificar o número de caracteres que queremos que o usuário entre ao utilizar o "ler", para isso utilizamos a bandeira "não", que, se não for seguida por um número, esperará até que o usuário entre uma quebra de linha, e se for seguida por um número, esperará até que o usuário entre 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 digite um valor confidencial, como uma senha, colocamos a bandeira -s
(segurança). Desta forma, quando o usuário insere os dados, eles não serão impressos no 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 mais
A maneira de escrever os condicionamentos "se" e "e" é:
"bash se [[condição]]; então declaração elif [[condição]]; então declaração senão declaração fi
É importante observar que as condições têm que estar entre parênteses rectos `[[]]`.
%%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 criar "se" 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 'se', mas é necessário explicar como criar expressões condicionais.
Se formos fazer comparações entre cordas ou cordas
operação | comando | exemplo | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
->>>`` | [[[[[[ string1 > string2 ] ]]` | >>> | ||||||||||
`` | [[[[[ string1 < string2 ]]` | sem mais de | ||||||||||
==` | [[[[ string1 == string2 ]]` | = string2 | ||||||||||
==``````[[[[ string1 = string2 ]]` | [[[[ string2 |
fio vazio|-z
||[[ -z fio ]]
|||||``````````````````````[ -z fio
|n````[[ -n string ]||||n ||||
[[[[ string ]]`||||
Se o que vamos fazer é fazer comparações entre os números
operação | comando | exemplo | |||||
---|---|---|---|---|---|---|---|
-grande do que | ``-gt` | [[[[ número1 -gt número2 ]] | |||||
-grande ou igual a | -ge | [[[[ número1 - número da idade2 ]]
| |||||
-lt`` | [[[ número1 -lt número2 ]]
| ||||||
-le` | [[[ número1 -le número2 ]]
| -le |
Igual a |-eq
||[[[ número1 -eq número2 ]]
|||||-
|-diferente do que|
-ne|
[[[ número1 -ne número2 ]]`|| ``
Se quisermos verificar arquivos ou diretórios
operação | comando | exemplo | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
é um diretório? | -d | [[ -d <dir> ]] | |||||||||||||||||||
é um arquivo? | -f | [[ -f <file> ]] | |||||||||||||||||||
existe? | -e | [[ -e <file> ]] ou [[ -e <dir> ]] | |||||||||||||||||||
é legível? | -r | [[ -r <file> ]] | - | ||||||||||||||||||
é escrevível? | -w | [[ -w <file> ]] | |||||||||||||||||||
é executável? | -x | [[ -x <file> ]] | É executável? | -x | [[ -x | ||||||||||||||||
é um link? | -L | [[ -L <file> ]] | |||||||||||||||||||
es tem conteúdo? | -s | [[ -s <file> ]] | s | ||||||||||||||||||
é propriedade do usuário? | -O | [[[ -O | - | ||||||||||||||||||
é propriedade do grupo? | -G | [[ -G <file> ]] | |||||||||||||||||||
foi modificado? | -N | [[[ -N <file> ]] | `` | ||||||||||||||||||
file1 é mais novo que file2? | ```-nt` | [[[ <file1> -nt <file2> ]] | |||||||||||||||||||
file1 é mais antigo que file2? | -ot | [[[ <file1> -ot <file2> ]] | |||||||||||||||||||
file1 é o mesmo arquivo que file2? | -ef | [[[ <file1> -ef <file2> ]] | |||||||||||||||||||
file1 é o mesmo arquivo que file2? | -ef | [[[ <file1> -ef <file2> ]] |
Se quisermos comparar as condições conjuntas com "e", "ou" e "não".
operação | comando | exemplo | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
&&&&``````[[[ <condição1> &&&&&&&&&`````` | &&&&&`````[[[ <condição1> &&&&&&&&&&&&&&&&&&&&&&&&&&&&&& | ||||||||||
`` | ```[[[ <condição1> | <condição2> ]]` |
Se quisermos negar as condições
operação | comando | exemplo | |||
---|---|---|---|---|---|
não | ! | [[[ ! <condiçã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 "\nComparando 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 "\nComparando 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 "\nComparando expresiones con AND"if [[ 2 > 1 && 3 > 1 ]]; thenecho "2 > 1 y 3 > 1"fiecho -e "\nComparando expresiones con OR"if [[ 2 > 1 || 1 > 2 ]]; thenecho "2 > 1 o 1 > 2"fiecho -e "\nComparando 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
Declaração de "caixa
A seguir veremos como escrever o típico "caso de troca", mas neste caso basta utilizar o "caso".
"bash
caso $variavel em
%%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 ver como as arrays se comportam no 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 "\nAccediendo 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 "\nLongitud 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 "\nAñ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
Loop for
Para utilizar o laço "para", a seguinte sintaxe deve ser utilizada
"bash
para <variável> em
Vejamos 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 "\nIterar a través de un array de strings"for string in ${arrayStrings[*]}doecho "String: $string"doneecho -e "\nIterar a través de un array no declarado"for string in "Manolo" "Juan" "Pedro"doecho "String: $string"doneecho -e "\nIterar a través de un rango"for i in {1..10}doecho "Número: $i"doneecho -e "\nIterar a través de un rango de manera clásica"for (( i=1; i<=10; i++ ))doecho "Número: $i"doneecho -e "\nIterar a través de un comando"for file in $(ls)doecho "Archivo: $file"doneecho -e "\nIterar 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
while
loop
Para utilizar o laço "entretanto", utilize a seguinte sintaxe
"bash enquanto <condição> do sentença feito
Vejamos 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 quebrar
e continuar
.
Podemos controlar o fluxo de um loop utilizando as palavras "quebrar" e "continuar", aqui está 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 das funções de escrita é
<nombre de funcion> (){
sentencias
}
Aqui está 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