Herranz

Sesión 04: Laboratorio Bash Scripts

Primer script de Bash

1
2
#!/bin/bash
echo Hola mundo
1
2
$ ./hola.sh
bash: ./hola.sh: Permiso denegado
1
2
3
$ chmod +x hola.sh 
$ ./hola.sh
Hola mundo
1
2
$ /bin/bash < hola.sh 
Hola mundo

Script de predicción del tiempo

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$ curl -s https://wttr.in/madrid
Weather report: madrid

      \   /     Sunny
      .-.      +13(12) °C
      ― (   ) ―   ↙ 7 km/h
      `-’      10 km
      /   \     0.0 mm
                                                       ┌─────────────┐
┌──────────────────────────────┬───────────────────────┤  Fri 15 Dec ├───────────────────────┬──────────────────────────────┐
│            Morning           │             Noon      └──────┬──────┘     Evening           │             Night            │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
\   /     Sunny          │     \   /     Sunny          │     \   /     Clear          │     \   /     Clear          │
│      .-.      +7(5) °C       │      .-.      +11(10) °C     │      .-.      +10(9) °C      │      .-.      +8(7) °C       │
│   ― (   ) ―   ↓ 8-12 km/h    │   ― (   ) ―   ↙ 11-12 km/h   │   ― (   ) ―   ↙ 8-14 km/h    │   ― (   ) ―   ↙ 6-13 km/h    │
`-’      10 km          │      `-’      10 km          │      `-’      10 km          │      `-’      10 km          │
│     /   \     0.0 mm | 0%    │     /   \     0.0 mm | 0%    │     /   \     0.0 mm | 0%    │     /   \     0.0 mm | 0%    │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
                                                       ┌─────────────┐
┌──────────────────────────────┬───────────────────────┤  Sat 16 Dec ├───────────────────────┬──────────────────────────────┐
│            Morning           │             Noon      └──────┬──────┘     Evening           │             Night            │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
\   /     Sunny          │     \   /     Sunny          │     \   /     Clear          │     \   /     Clear          │
│      .-.      +6(5) °C       │      .-.      11 °C          │      .-.      +8(9) °C       │      .-.      7 °C           │
│   ― (   ) ―   ↙ 7-11 km/h    │   ― (   ) ―   ↓ 5-6 km/h     │   ― (   ) ―   ↙ 3-7 km/h     │   ― (   ) ―   ↙ 5-10 km/h    │
`-’      10 km          │      `-’      10 km          │      `-’      10 km          │      `-’      10 km          │
│     /   \     0.0 mm | 0%    │     /   \     0.0 mm | 0%    │     /   \     0.0 mm | 0%    │     /   \     0.0 mm | 0%    │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
                                                       ┌─────────────┐
┌──────────────────────────────┬───────────────────────┤  Sun 17 Dec ├───────────────────────┬──────────────────────────────┐
│            Morning           │             Noon      └──────┬──────┘     Evening           │             Night            │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
\   /     Sunny          │     \   /     Sunny          │     \   /     Clear          │     \   /     Clear          │
│      .-.      +6(5) °C       │      .-.      10 °C          │      .-.      8 °C           │      .-.      +7(6) °C       │
│   ― (   ) ―   ↙ 5-10 km/h    │   ― (   ) ―   ↙ 5 km/h       │   ― (   ) ―   ↙ 2-5 km/h     │   ― (   ) ―   ↓ 6-13 km/h    │
`-’      10 km          │      `-’      10 km          │      `-’      10 km          │      `-’      10 km          │
│     /   \     0.0 mm | 0%    │     /   \     0.0 mm | 0%    │     /   \     0.0 mm | 0%    │     /   \     0.0 mm | 0%    │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
Location: Madrid, Área metropolitana de Madrid y Corredor del Henares, Comunidad de Madrid, España [40.4167047,-3.7035824]

Follow @igor_chubin for wttr.in updates

Argumentos de un Script

1
2
3
4
5
6
#!/bin/bash
echo Número de argumentos: $#
echo Argumento 0: $0
echo Argumento 1: $1
echo Argumento 2: $2
echo Todos los argumentos: $*
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ ./param.sh 
Número de argumentos: 0
Argumento 0: ./arg.sh
Argumento 1:
Argumento 2:
Todos los argumentos:
$ ./param.sh 1 dos III 100
Número de argumentos: 4
Argumento 0: ./arg.sh
Argumento 1: 1
Argumento 2: dos
Todos los argumentos: 1 dos III 100

Fecha de hoy

1
2
$ date +%Y-%m-%d
2023-12-15
1
2
$ echo la fecha es $(date +%Y-%m-%d)
la fecha es 2023-12-15
1
2
3
4
$ FECHA=$(date +%Y-%m-%d)
$ touch $FECHA.txt
$ ls -al *.txt
-rw-r--r-- 1 angel angel    0 dic 15 18:29 2023-12-15.txt
1
2
$ rm $FECHA.txt
$ ls -al *.txt

Primera versión de tiempo.sh

1
2
3
4
#!/bin/bash

FECHA=$(date +%Y-%m-%d)
curl https://wttr.in/madrid?T > madrid-$FECHA.txt
1
2
3
4
$ ./tiempo.sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6649  100  6649    0     0  16069      0 --:--:-- --:--:-- --:--:-- 16099
1
 curl https://wttr.in/madrid?T > madrid-$FECHA.txt 2> /dev/null
1
 curl --silent https://wttr.in/madrid?T > madrid-$FECHA.txt
1
2
$ ls -al *.txt
-rw-r--r-- 1 angel angel 6649 dic 15 18:55 madrid-2023-12-15.txt

Segunda versión de tiempo.sh

1
2
3
4
#!/bin/bash

FECHA=$(date +%Y-%m-%d)
curl --silent https://wttr.in/$1?T > $1-$FECHA.txt
1
2
3
4
$ ./tiempo.sh barcelona
$ ls -al *.txt
-rw-r--r-- 1 angel angel 6703 dic 15 19:04 barcelona-2023-12-15.txt
-rw-r--r-- 1 angel angel 6649 dic 15 18:55 madrid-2023-12-15.txt

Tercera versión de tiempo.sh

1
 if list; then list; [ elif list; then list; ] ... [ else list; ] fi
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/bin/bash

if <<$# ES IGUAL A 1>>; then
    if <<$1 ES IGUAL A -h>>; then
        <<MENSAJE DE AYUDA EN SALIDA ESTÁNDAR>>
    else 
        FECHA=$(date +%Y-%m-%d)
        curl --silent https://wttr.in/$1?T > $1-$FECHA.txt
    fi
else
  <<MENSAJE DE AYUDA EN SALIDA DE ERROR>>
  exit 1
fi

exit 0

El programa test

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/bin/bash

if test $# -eq 1; then
    if test "$1" = "-h">>; then
        <<MENSAJE DE AYUDA EN SALIDA ESTÁNDAR>>
    else 
        FECHA=$(date +%Y-%m-%d)
        curl --silent https://wttr.in/$1?T > $1-$FECHA.txt
    fi
else
  <<MENSAJE DE AYUDA EN SALIDA DE ERROR>>
  exit 1
fi

exit 0
1
2
3
echo "USO: $0 [ -h | LUGAR ]"
echo "  Crea un fichero con el nombre del lugar y la fecha actual conteniendo"
echo "  la predicción del tiempo según el servicio https://wttr.in"
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

if test $# -eq 1; then
    if test "$1" = "-h"; then
        echo "USO: $0 [ -h | LUGAR ]"
        echo "  Crea un fichero con el nombre del lugar y la fecha actual conteniendo"
        echo "  la predicción del tiempo según el servicio https://wttr.in"
    else 
        FECHA=$(date +%Y-%m-%d)
        curl --silent https://wttr.in/$1?T > $1-$FECHA.txt
    fi
else
    echo "USO: $0 [ -h | LUGAR ]" 1>&2
    echo "  Crea un fichero con el nombre del lugar y la fecha actual conteniendo" 1>&2
    echo "  la predicción del tiempo según el servicio https://wttr.in" 1>&2
    exit 1
fi

exit 0
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$ ./tiempo amsterdam
$ echo $?
$ ./tiempo
$ echo $?
$ ./tiempo -h
$ echo $?
$ ./tiempo madrid barcelona
$ echo $?
$ ./tiempo > /dev/null
$ echo $?
$ ./tiempo -h > /dev/null
$ echo $?
$ ./tiempo 2> /dev/null
$ echo $?
$ ./tiempo -h 2> /dev/null
$ echo $?

El programa [

1
 test "$1" = "-h"
1
 [ "$1" = "-h" ]
1
 test -e madrid.txt
1
 [ -e madrid.txt ]

Cuarta versión de tiempo.sh

1
  test -e $1-$FECHA.txt
1
  LUGAR=$1
1
  NOMBREFICHERO=$LUGAR-$FECHA.txt
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if test $# -eq 1; then
    if test "$1" = "-h"; then
        echo "USO: $0 [ -h | LUGAR ]"
        echo "  Crea un fichero con el nombre del lugar y la fecha actual conteniendo"
        echo "  la predicción del tiempo según el servicio https://wttr.in"
    else
        LUGAR=$1
        FECHA=$(date +%Y-%m-%d)
        NOMBREFICHERO=$LUGAR-$FECHA.txt
        if test -e $NOMBREFICHERO; then
            <<NO SE QUÉ HACER AQUÍ, QUIZÁS NADA>>
        else
            curl --silent https://wttr.in/$LUGAR?T > $NOMBREFICHERO
        fi
    fi
else
    echo "USO: $0 [ -h | LUGAR ]" 1>&2
    echo "  Crea un fichero con el nombre del lugar y la fecha actual conteniendo" 1>&2
    echo "  la predicción del tiempo según el servicio https://wttr.in" 1>&2
    exit 1
fi

exit 0
1
2
3
4
5
6
7
test EXPRESSION
       An omitted EXPRESSION defaults to false.  Otherwise, EXPRESSION
       is true or false and sets exit status.  It is one of:
       ...
       ! EXPRESSION
              EXPRESSION is false
       ...
1
2
3
4
5
        if test ! -e $NOMBREFICHERO; then
            curl --silent https://wttr.in/$LUGAR?T > $NOMBREFICHERO
        else
            echo El fichero $NOMBREFICHERO ya existe
        fi
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash

if test $# -eq 1; then
    if test "$1" = "-h"; then
        echo "USO: $0 [ -h | LUGAR ]"
        echo "  Crea un fichero con el nombre del lugar y la fecha actual conteniendo"
        echo "  la predicción del tiempo según el servicio https://wttr.in"
    else
        LUGAR=$1
        FECHA=$(date +%Y-%m-%d)
        NOMBREFICHERO=$LUGAR-$FECHA.txt
        if test ! -e $NOMBREFICHERO; then
            curl --silent https://wttr.in/$LUGAR?T > $NOMBREFICHERO
        else
            echo El fichero $NOMBREFICHERO ya existe
        fi
    fi
else
    echo "USO: $0 [ -h | LUGAR ]" 1>&2
    echo "  Crea un fichero con el nombre del lugar y la fecha actual conteniendo" 1>&2
    echo "  la predicción del tiempo según el servicio https://wttr.in" 1>&2
    exit 1
fi

exit 0

case

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash

if test $# -eq 1; then
    case $1 in
        -h | --help)
            echo "USO: $0 [ -h | LUGAR ]"
            echo "  Crea un fichero con el nombre del lugar y la fecha actual conteniendo"
            echo "  la predicción del tiempo según el servicio https://wttr.in"
            ;;
        *)
            LUGAR=$1
            FECHA=$(date +%Y-%m-%d)
            NOMBREFICHERO=$LUGAR-$FECHA.txt
            if test ! -e $NOMBREFICHERO; then
                curl --silent https://wttr.in/$LUGAR?T > $NOMBREFICHERO
            else
                echo El fichero $NOMBREFICHERO ya existe
            fi
            ;;
    esac
else
    echo "USO: $0 [ -h | LUGAR ]" 1>&2
    echo "  Crea un fichero con el nombre del lugar y la fecha actual conteniendo" 1>&2
    echo "  la predicción del tiempo según el servicio https://wttr.in" 1>&2
    exit 1
fi

Versión final de tiempo.sh

1
2
3
4
function fname
{
    list;
}
1
  fname a1 a2 ...
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
function descargar_wttr
{
    LUGAR=$1
    FECHA=$(date +%Y-%m-%d)
    NOMBREFICHERO=$LUGAR-$FECHA.txt
    if test ! -e $NOMBREFICHERO; then
        curl --silent https://wttr.in/$LUGAR?T > $NOMBREFICHERO
        return 0;
    else
        return 1;
    fi
}
1
2
3
            if ! descargar_wrrt $1; then
                echo El fichero $NOMBREFICHERO ya existe
            fi
1
  descargar_wrrt valencia
1
2
3
4
5
uso() {
    echo "USO: $0 [ -h | LUGAR ]"
    echo "  Crea un fichero con el nombre del lugar y la fecha actual conteniendo"
    echo "  la predicción del tiempo según el servicio https://wttr.in"
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash

uso() {
    echo "USO: $0 [ -h | LUGAR ]"
    echo "  Crea un fichero con el nombre del lugar y la fecha actual conteniendo"
    echo "  la predicción del tiempo según el servicio https://wttr.in"
}

function descargar_wttr
{
    LUGAR=$1
    FECHA=$(date +%Y-%m-%d)
    NOMBREFICHERO=$LUGAR-$FECHA.txt
    if test ! -e $NOMBREFICHERO; then
        curl --silent https://wttr.in/$LUGAR?T > $NOMBREFICHERO
        return 0
    else
        return 1
    fi
}

if test $# -eq 1; then
    case $1 in
        -h | --help)
            uso
            ;;
        *)
            if ! descargar_wrrt $1; then
                echo El fichero $NOMBREFICHERO ya existe
            fi
            ;;
    esac
else
    uso 1>&2
    exit 1
fi

exit 0

Iteraciones

1
2
3
4
5
#!/bin/bash
echo Número de argumentos: $#
for arg in $*; do
    echo Argumento: $arg
done
1
2
3
4
5
6
7
8
9
       shift [n]
              The positional parameters from n+1 ... are renamed to $1
              ....  Parameters represented by the numbers $#  down  to
              $#-n+1  are unset.  n must be a non-negative number less
              than or equal to $#.  If  n  is  0,  no  parameters  are
              changed.   If n is not given, it is assumed to be 1.  If
              n is greater than $#, the positional parameters are  not
              changed.  The return status is greater than zero if n is
              greater than $# or less than zero; otherwise 0.
1
2
3
4
5
6
7
8
9
#!/bin/bash
echo Número de argumentos: $#

N=$#

while (($#)); do
    echo Argumento $((N - $# + 1)): $1
    shift
done

Ejercicio propuesto

Famous Last Words

1
 grep -zqs '^container=' /proc/1/environ && exit 0
1
2
3
if grep -zqs '^container=' /proc/1/environ; then
    exit 0
fi
1
 [ -x "$DAEMON" ] || exit 0
1
2
3
4
5
if [ -x "$DAEMON" ]; then
    ; # No hacer nada
else
    exit 0
fi