Shell Scripting#

Dar permisos de ejecución a un script:

$ cat script.sh
#!/bin/bash
nombre=$(whoami)
echo hola ${nombre}

$ chmod +x script.sh

$ ./script.sh
hola dani

Entrada de datos#

  • Argumentos de entrada

    $ cat args.sh
    #!/bin/bash
    X=$1
    Y=$2
    Z=$3
    echo X=$X Y=$Y Z=$Z
    echo "En total hay $# argumentos : $@"
    
    $ ./args.sh uno dos tres
    X=uno Y=dos Z=tres
    En total hay 3 argumentos : uno dos tres
    
  • shift desplaza los argumentos el número de veces que aparezca

    $ cat args.sh
    #!/bin/bash
    shift
    X=$1
    Y=$2
    Z=$3
    echo X=$X Y=$Y Z=$Z
    echo "En total hay $# argumentos : $@"
    
    $ ./args.sh uno dos tres
    X=dos Y=tres Z=
    En total hay 2 argumentos : dos tres
    
    $ cat args.sh
    #!/bin/bash
    shift
    shift
    X=$1
    Y=$2
    Z=$3
    echo X=$X Y=$Y Z=$Z
    echo "En total hay $# argumentos : $@"
    
    $ ./args.sh uno dos tres
    X=tres Y= Z=
    En total hay 1 argumentos : tres
    
  • En el caso de que queramos que se tome un argumento por defecto:

    $ cat args.sh
    #!/bin/bash
    X=${1:-hola}
    Y=${2:-33}
    Z=${3:-$(whoami)}
    echo X=$X Y=$Y Z=$Z
    echo "En total hay $# argumentos : $@"
    
    $ ./args.sh uno dos tres
    X=uno Y=dos Z=tres
    En total hay 3 argumentos : uno dos tres
    
    $ ./args.sh
    X=hola Y=33 Z=dani
    En total hay 0 argumentos :
    
  • En el caso de que queramos que el programa se pare a preguntar por el valor de una variable utilizaremos read

    $ cat args.sh
    #!/bin/bash
    echo "Hola, ¿Cómo te llamas?"
    read X
    echo Hola $X
    
    $ ./args.sh
    Hola, ¿Cómo te llamas?
    dani
    Hola dani
    

Bucles y condicionales#

  • Bucles

    $ cat for.sh
    #!/bin/bash
    for ((i=0;i<6;i++))
    do
      echo $i
    done
    
    $ ./for.sh
    0
    1
    2
    3
    4
    5
    
  • Bucles y condicionales

    $ cat for.sh
    #!/bin/bash
    for ((i=1;i<6;i++))
    do
      X=3
      if [ $i -gt $X ]
      then
        echo $i es mayor que $X
      else
        echo $i es menor o igual que $X
      fi
    done
    
    $ ./for.sh
    1 es menor o igual que 3
    2 es menor o igual que 3
    3 es menor o igual que 3
    4 es mayor que 3
    5 es mayor que 3
    

    Podríamos sustituir la linea if [ $i -gt $X ] por :

    if [[ $i -gt $X ]]
    if test $i -gt $X
    
  • Evaluación de condiciones numéricas

    if test $i -gt $X # -gt grater than
    if test $i -ge $X # -gt grater or equal than
    if test $i -lt $X # -lt less than
    if test $i -eq $X # -eq equal than
    if test $i -ne $X # -ne not equal than
    
  • Comparación de cadenas

    $ grep '/bin/bash' file.dat | grep -v root
    
    dani:x:1001:1000:dani,,,:/home/dani:/bin/bash
    ramon:x:1002:1000:ramon,,,:/home/ramon:/bin/bash
    pablo:x:1003:1000:pablo,,,:/home/pablo:/bin/bash
    alvaro:x:1004:1000:alvaro,,,:/home/alvaro:/bin/bash
    cris:x:1005:1000:cris,,,:/home/cris:/bin/bash
    ana:x:1006:1000:ana,,,:/home/ana:/bin/bash
    elvira:x:1007:1000:elvira,,,:/home/elvira:/bin/bash
    
    $ cat for2.sh
    #!/bin/bash
    for i in $(grep '/bin/bash' file.dat | grep -v root|cut -d':' -f1)
    do
      echo $i
    done
    
    $ ./for2.sh
    dani
    ramon
    pablo
    alvaro
    cris
    ana
    elvira
    
    $ cat for2.sh
    #!/bin/bash
    for i in $(grep '/bin/bash' file.dat | grep -v root|cut -d':' -f1)
    do
      if test $i == "dani"
      then
        echo $i encontrado
      fi
    done
    
     $ ./for2.sh
     dani encontrado
    

    Podríamos sustituir la linea if test $i == «dani» por:

    if [ $i == "dani" ]
    if [[ $i == "dani" ]]
    
  • Evaluación de condiciones con cadenas de caracteres:

    Str1 == Str2 # Returns true if the strings are equal
    Str1 != Str2 # Returns true if the strings are not equal
    -n Str1      # Returns true if the string is not null
    -z Str1      # Returns true if the string is null
    
  • Otras forma de hacer bucles

    for i in a b c
    do
      echo $i
    done
    a
    b
    c
    
    i=0
    while [ $i -lt 4 ]
    do
      i=$(($i+1))
    echo $i
    done
    1
    2
    3
    4
    
    #seguirá hasta que el archivo file.dat sea creado
    while ! test -e file.dat
    do
      sleep 1s
      date
    done
    
  • Juntar expresiones and y or

    for i in a b c
    do
      for j in a b c
      do
        if [ $i == $j ] && [ $j == "a" ]
        then
          echo $i $j ',i j son iguales y j = a'
        fi
        if [ $i == $j ] || [ $j == "a" ]
        then
          echo $i $j ',i j son iguales o j = a'
        fi
      done
    done
    a a ,i j son iguales y j = a
    a a ,i j son iguales o j = a
    b a ,i j son iguales o j = a
    b b ,i j son iguales o j = a
    c a ,i j son iguales o j = a
    c c ,i j son iguales o j = a
    

Propiedades de archivos y carpetas#

$ cat file.sh
#!/bin/bash
archivo=$1

if test -e $archivo #True si existe
then
  if test -d $archivo
  then
    echo "La carpeta $archivo existe"
  fi
  if test -f $archivo
  then
    echo "El archivo $archivo existe"
  fi
  if test -r $archivo
  then
    echo "tiene permisos de lectura"
  fi
  if test -w $archivo
  then
    echo "tiene permisos de escritura"
  fi
  if test -x $archivo
  then
    echo "tiene permisos de ejecución"
  fi
else
  echo $archivo" no existe "
fi

$ echo hola > hola.dat
$ chmod +rwx hola.dat
$ ./file.sh hola.dat
El archivo hola.dat existe
tiene permisos de lectura
tiene permisos de escritura
tiene permisos de ejecución

$ mkdir dir
$ chmod +rw dir
$ chmod -x dir
$ ./file.sh dir
La carpeta dir/ existe
tiene permisos de lectura
tiene permisos de escritura

Funciones#

function Suma(){
a=$1
b=$2
c=$((a+b))
echo $c
}

$ Suma 1 2
3

Arrays#

$ palabra=("PYTHON" "LINUX" "BASH" "GITHUB" "DOCKER")

$ echo ${palabra[0]}
PYTHON

$ echo ${palabra[1]}
LINUX

$ longitud=${#palabra[@]}
$ echo $longitud
5

$ for((i=0;i<$longitud;i++))
> do
> echo palabra[$i]=${palabra[$i]}
> done

palabra[0]=PYTHON
palabra[1]=LINUX
palabra[2]=BASH
palabra[3]=GITHUB
palabra[4]=DOCKER

$ for i in ${palabra[@]}
> do
> echo $i
> done
PYTHON
LINUX
BASH
GITHUB
DOCKER
$ A[0]=1
$ echo ${A[0]}
1

$ echo ${A[1]}

$ for i in 1 2 3 4
> do
> A[$i]=$i
> done

$ for i in 1 2 3 4
> do
> echo ${A[$i]}
> done
1
2
3
4

$ echo $((${A[1]}+${A[2]}))
3

Escritura de archivos#

$ tunombre=dani
$ cat << EOF > new_file.dat
Mi nombre es $tunombre
hoy es $(date)
EOF

$ cat new_file.dat
Mi nombre es dani
hoy es mié 12 oct 2022 16:37:57 CEST

Podemos hacer lo mismo:

$ echo "Mi nombre es $tunombre
hoy es $(date)" >> new_file.dat