Shell Scripting ############### Varios ****** Argumentos ========== +-----+------------------------------------------+ | $# | Number of arguments | +-----+------------------------------------------+ | $* | All arguments | +-----+------------------------------------------+ | $@ | All arguments, starting from first | +-----+------------------------------------------+ | $1 | First argument | +-----+------------------------------------------+ Sustitución de comandos ======================= .. code-block:: bash $(comando) `comando` por ejemplo .. code-block:: bash $ echo $(pwd) /home/darthmendez Variables ********* .. code-block:: bash NOMBRE="Mariano" Con el $ se obtiene el valor: .. code-block:: bash $ echo $NOMBRE Mariano Se puede obtener el valor de una variable dentro de un string, usando la forma canonica del signo $: .. code-block:: bash $ echo "Mi nombre es $NOMBRE" Mi nombre es Mariano O se puede obtener nediante el operador de sustutución que es ${}: .. code-block:: bash $ echo "Mi nombre es ${NOMBRE}" Mi nombre es Mariano .. code-block:: bash $ echo 'Mi nombre es $NOMBRE' Mi nombre es $NOMBRE .. code-block:: bash $ NOMBRE+=" Mendez" $ echo $NOMBRE Mariano Mendez Arreglos ======== .. code-block:: bash foo[0]="primero" # asigna al primer elemento "first" foo[1]="segundo" # asigna al segundo elemento "second" Otra forma de asignar es la asignacion por extensión: .. code-block:: bash $ array=(a b c) $ echo $array # prints a $ echo ${array[@]} # prints a b c $ echo ${array[*]} # prints a b c Estructuras de Control ********************** test ==== Este comando chequea el tipo de archivos y compara valores (man test) .. code-block:: bash test expression [ expresion ] ejemplo .. code-block:: bash [ $V -eq 0 ] Valores Numéricos: +-----------+---------+ | n1 -eq n2 | n1 = n2 | +-----------+---------+ | n1 -ne n2 | n1 ≠ n1 | +-----------+---------+ | n1 -gt n2 | n1 > n2 | +-----------+---------+ | n1 –ge n2 | n1 ≥ n2 | +-----------+---------+ | n1 -lt n2 | n1 < n2 | +-----------+---------+ | n1 -le n2 | n1 ≤ n2 | +-----------+---------+ Strings: +------------------+----------------------------------------------------------+ | "$VAR" = "cad" | $VAR vale "cad". | +------------------+----------------------------------------------------------+ | "$VAR" != "cad" | $VAR vale algo distinto de "cad". | +------------------+----------------------------------------------------------+ | -z "$VAR" | $VAR está vacía. Equivale a "$VAR" = "" | | "$VAR" | | +------------------+----------------------------------------------------------+ | -n "$VAR" | $VAR no está vacía. Equivale a "$VAR" != "" o ! -z | +------------------+----------------------------------------------------------+ Archivos: +-------------+----------------------------------------------------------+ | -e "$FILE" | $FILE existe. | +-------------+----------------------------------------------------------+ | -f "$FILE" | $FILE existe y es regular. | +-------------+----------------------------------------------------------+ | -h "$FILE" | $FILE existe y es un enlace simbólico | +-------------+----------------------------------------------------------+ | -d "$DIR" | $DIR existe y es un archivo de tipo directorio | +-------------+----------------------------------------------------------+ | -p "$FILE" | $FILE existe y es un archivo especial tubería (pipe) | +-------------+----------------------------------------------------------+ | -b "$FILE" | $FILE existe y es un archivo especial de bloques | +-------------+----------------------------------------------------------+ | -c "$FILE" | $FILE existe y es un archivo especial de caracteres | +-------------+----------------------------------------------------------+ | -r "$FILE" | $FILE existe y puede leerse | +-------------+----------------------------------------------------------+ | -w "$FILE" | $FILE existe y puede modificarse | +-------------+----------------------------------------------------------+ | -x "$FILE" | $FILE existe y puede ejecutarse | +-------------+----------------------------------------------------------+ | -s "$FILE" | $FILE existe y su tamaño es mayor de cero bytes | +-------------+----------------------------------------------------------+ if-fi ===== If ejecuta comando, si el valor de retorno de la ejecución es 0 se ejecuta comando1 sino se ejecuta comando2 .. code-block:: bash if comando; then comando1 else comando2 fi ejemplo: .. code-block:: bash VALOR=1 if [$VALOR=1];then comando1 comando2 else comando3 comando4 fi ejemplo más complejo: .. code-block:: bash if command ; then comando1 comando2 elif comando3 ; then comando4 comando5 comando6 else echo 'todo fallo' exit 1 # termina el script con valor no 0 fi Loops +++++ for --- El for tiene dos sintaxis, la primera: :: for name [ [ in [ word ... ] ] ; ] do list ; done El funcionamiento es el siguiente, se crea una lista expandiendo lo que se encuentra despues del in, la varianle con el nombre name tome el valor de cada elemento de la lista, y se ejecuta la lista list de comandos para cada valor de name. .. code-block:: bash for file in *.txt ; do mv "$file" "$file.bak" done la segunda forma de sintaxis de for es la misma que la del lenguaje C: :: for (( init ; cond ; incr )) ; do list ; done While ----- La sintaxis del while es : .. code-block:: bash while comando; do comando1 comando2 comando3 done ejemplo: .. code-block:: bash while [[ -e wait.txt ]] ; do sleep 3 # "sleep" for three seconds done Until ----- La sintaxis de until es muy similar a la de while: .. code-block:: bash until comando ; do comando1 comando2 done .. code-block:: bash until [[ -e proceed.txt ]] ; do sleep 3 # "sleep" for three seconds done Funciones ========= A diferencia de las funciones de los lenguajes de programación "reales", las funciones Bash no pueden devolver un valor cuando se las llama. Cuando se completa una función bash, su valor de retorno es el estado de la última instrucción ejecutada en la función, 0 para el éxito y un número decimal distinto de cero en el rango de 1 a 255 para el fracaso. El estado de retorno puede especificarse utilizando la palabra clave return y se asigna a la variable $?. La utilización de return termina la función. En un script bash se pueden crear funciones, la sintaxis es la siguiente: .. code-block:: bash myfunc() { echo "hello $1" } # sintaxis alternativa function myfunc() { echo "hello $1" } Valore de retorno: .. code-block:: bash myfunc() { local myresult='some value' echo $myresult } result="$(myfunc)" Expresiones regulares ********************* Las expresiones regulares son un medio para describir patrones de texto puntos de anclaje: +-----+-----------------------+ | ^ | inicio de línea | +-----+-----------------------+ | $ | fin de línea | +-----+-----------------------+ | \< | principio de palabra | +-----+-----------------------+ | \> | fin de palabra | +-----+-----------------------+ | \b | límite de palabra | +-----+-----------------------+ cuantificadores: +--------+-----------------------------------------+ | ? | el carácter aparece ninguna o una vez. | +--------+-----------------------------------------+ | * | cero, una o varias veces. | +--------+-----------------------------------------+ | + | al menos una vez. | +--------+-----------------------------------------+ | {4} | cuatro veces. | +--------+-----------------------------------------+ | {4,10}| entre 4 y 10 veces | +--------+-----------------------------------------+ tipos de caracteres: * [:alnum:] [A-Za-z0-9] Caracteres alfanuméricos (letras y números) * [:word:] [A-Za-z0-9\_] Caracteres alfanuméricos y “_” * [:alpha:] [A-Za-z] Caracteres alfabéticos * [:blank:] [ \t] Espacio y tabulador * [:space:] [ \t\r\n\v\f] Espacios * [:digit:] [0-9] Dígitos * [:lower:] [a-z] Letras minúsculas * [:upper:] [A-Z] Letras mayúsculas * [:punct:] [][!”#$%&’()*,./:;<=>?@\^_`{\}~-] Caracteres de puntuación * Obtener todas las palabras que contengan alguna letra "a" $ grep -E --color 'a' hobbit.txt * Ontener todas las palabras que contengan el string "ar" $ grep -E --color 'ar' hobbit.txt * Obtener todas las palabras que tengan exactamente una letra "a", entre 3 y 7 letras y no empiecen con una a $ grep -E --color '\<[^a]{2,7}a[^a]\>' hobbit.txt * Obtener todas las palabras que empiecen con h y terminen con s $ grep -E --color '\bh[A-Za-z]*s\b' hobbit.txt