| Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia |
| linux:bash:shellvariables [12/11/2018 23:52] – [Operaciones con cadenas desde bash] admin | linux:bash:shellvariables [01/10/2024 03:53] (actual) – [Operaciones sobre cadenas] mate |
|---|
| = Special Shell Variables & Parameter Substitution and Expansion | = Special Shell Variables & Parameter Substitution and Expansion |
| | {{tag>linux}}{{tag>bash}} |
| **$** es utilizado para expansión de parámetros y sustitución de comandos | **$** es utilizado para expansión de parámetros y sustitución de comandos |
| |
| ^ expresión ^ Significado ^ | ^ expresión ^ Significado ^ |
| | ${variable} | valor de variable, lo mismo que $variable | | | ${variable} | valor de variable, lo mismo que $variable | |
| | ${parametro-valorPorDefecto}} | si el parámetro no está establecido, se le asigna el de por defecto | | | ${parametro-valorPorDefecto} | si el parámetro no está establecido, se le asigna el de por defecto | |
| | ${parametro:-valorPorDefecto}} | si el parámetro no está establecido o es vacío, se le asigna el de por defecto (sobre variables solo?) | | | ${parametro:-valorPorDefecto} | si el parámetro no está establecido o es vacío, se le asigna el de por defecto (sobre variables solo?) | |
| | ${parametro=valorPorDefecto}} | si el parámetro no está establecido, se le asigna el de por defecto (no funciona sobre parametros posicionales -$1,$2...-) | | | ${parametro=valorPorDefecto} | si el parámetro no está establecido, se le asigna el de por defecto (no funciona sobre parametros posicionales -$1,$2...-) | |
| | ${parametro:=valorPorDefecto}} | si el parámetro no está establecido o es vacío, se le asigna el de por defecto (no funciona sobre parametros posicionales -$1,$2...-)| | | ${parametro:=valorPorDefecto} | si el parámetro no está establecido o es vacío, se le asigna el de por defecto (no funciona sobre parametros posicionales -$1,$2...-)| |
| | ${variable?MensajeError} | comprueba si variable no está establecida, mostrando el mensaje de error y para la ejecución del script | | | ${variable?MensajeError} | comprueba si variable no está establecida, mostrando el mensaje de error y para la ejecución del script | |
| | ${variable:?MensajeError} | comprueba si variable no está establecida o si es vacía, mostrando el mensaje de error y para la ejecución del script | | | ${variable:?MensajeError} | comprueba si variable no está establecida o si es vacía, mostrando el mensaje de error y para la ejecución del script | |
| === resumen expansion | === resumen expansion |
| /via: [[http://wiki.bash-hackers.org/syntax/pe?do=]]\\ | /via: [[http://wiki.bash-hackers.org/syntax/pe?do=]]\\ |
| | /mas: [[https://tldp.org/LDP/abs/html/string-manipulation.html]] |
| | |
| Looking for a specific syntax you saw, without knowing the name? | Looking for a specific syntax you saw, without knowing the name? |
| * [[#simple_usage | Simple usage]] | * [[#simple_usage | Simple usage]] |
| * ''${PARAMETER?WORD}'' | * ''${PARAMETER?WORD}'' |
| |
| | +info: [[linux:bash:indirectreferences|]] |
| == Operaciones sobre cadenas | == Operaciones sobre cadenas |
| /vía: [[http://www.marqueta.org/cadenas-en-bash/]] | * /vía: [[http://www.marqueta.org/cadenas-en-bash/]] |
| ^ expresión ^ Significado ^ Ejemplo ^ | * /vía: [[https://tldp.org/LDP/abs/html/string-manipulation.html]] |
| | ''${#parametro}'' | longitud de parámetro | echo ${#string} | | * /via: [[https://itsfoss.com/es/cadenas-bash/]] |
| | ''${cadena:posición}'' | extrae subcadena desde posición | echo ${string:4} | | |
| | ''${cadena:posición:longitud}'' | extrae subcadena desde posición la longitud solicitada | echo ${string:4:7} ; echo ${string::-1} | | |
| | ''${cadena#subcadena}'' | eliminar subcadena del principio de la cadena | echo ${string#substring | | |
| | ''${cadena%subcadena}'' | eliminar subcadena del final de la cadena | echo ${string%substring | | |
| | ''${cadena/s1/s2}'' | reemplazar primera aparicion s1 por s2 | | | |
| | ''${cadena%%//%%s1/s2}'' | reemplazar todas aparicion s1 por s2 | | | |
| | ''${cadena/#s1/s2}'' | reemplazar si hay coincidencia al princpio de cadena | | | |
| | ''${cadena/%s1/s2}'' | reemplazar si hay coincidencia al final de cadena | | | |
| | ''${cadena##*separador}'' | extrae el último elemento de la ristra, usando separador | %%data=foo,bar,baz;echo ${data##*,}%% | | |
| |
| | ^ expresión ^ Significado ^ Ejemplo ^ |
| | | ''${#parametro}'' | longitud de parámetro | echo ${#string} | |
| | | ''${cadena:posición}'' | extrae subcadena desde posición | echo ${string:4} | |
| | | ''${cadena:posición:longitud}'' | extrae subcadena desde posición la longitud solicitada | echo ${string:4:7} ; echo ${string::-1} | |
| | | ''${cadena#subcadena}'' | eliminar subcadena del principio de la cadena | echo ${string#substring%%}%% | |
| | | ''${cadena%subcadena}'' | eliminar subcadena del final de la cadena\\ permite uso * | echo ${string%substring%%}%%\\ echo ${string%substring*%%}%% | |
| | | ''${cadena/s1/s2}'' | reemplazar primera aparicion s1 por s2 | | |
| | | ''${cadena%%//%%s1/s2}'' | reemplazar todas aparicion s1 por s2 | | |
| | | ''${cadena/#s1/s2}'' | reemplazar si hay coincidencia al princpio de cadena | | |
| | | ''${cadena/%s1/s2}'' | reemplazar si hay coincidencia al final de cadena | | |
| | | recorrido | |
| | | ''${cadena##*separador}'' | extrae el último elemento de la ristra, usando separador | %%data=foo,bar,baz;echo ${data##*,}%% | |
| | | mayúsculas y minúsculas| |
| | | ''${cadena^^}'' | convierte a mayúsculas | | |
| | | ''${cadena^}'' | a mayúsculas el primer carácter | | |
| | | ''${cadena,,}'' | convierte a minúsculas | | |
| | | ''${cadena,}'' | a minúsculas el primer carácter | | |
| | | ''${¢adena^^[chars]}'' | cambia chars a mayúsculas | | |
| | | | | | |
| | |
| | === comparaciones |
| * ''$ a=foo; b=bar; [ "$a" = "$b" ] && echo "iguales" || echo "diferentes"'' <- espacios en condición importantes | * ''$ a=foo; b=bar; [ "$a" = "$b" ] && echo "iguales" || echo "diferentes"'' <- espacios en condición importantes |
| * ''$ a=foo; b=bar; [ "$a" == "$b" ] && echo "iguales" || echo "diferentes"'' <- idem anterior | * ''$ a=foo; b=bar; [ "$a" == "$b" ] && echo "iguales" || echo "diferentes"'' <- idem anterior |
| * ''$ a=foo; b=bar; [ "$a" != "$b" ] && echo "diferentes" || echo "iguales"'' | * ''$ a=foo; b=bar; [ "$a" != "$b" ] && echo "diferentes" || echo "iguales"'' |
| * ''$ a=foto.jpg ; [[ "$a" != *.gif ]] && echo "no gif" || echo "gif"'' <- doble corchetes hacen pattern matching | * ''$ a=foto.jpg ; %%[[ "$a" != *.gif ]]%% && echo "no gif" || echo "gif"'' <- doble corchetes hacen pattern matching |
| * ''$ a=foo; b=bar; [ "$a" = "foo" -a "$b" = "bar" ] && echo "todo OK" || echo "algo falla"'' <- -a equivale AND | * ''$ a=foo; b=bar; [ "$a" = "foo" -a "$b" = "bar" ] && echo "todo OK" || echo "algo falla"'' <- -a equivale AND |
| * ''$ a=foo; b=bar; [ "$a" = "foo" -o "$b" = "bar" ] && echo "al menos 1 OK" || echo "ninguno OK"'' <- -o equivale OR | * ''$ a=foo; b=bar; [ "$a" = "foo" -o "$b" = "bar" ] && echo "al menos 1 OK" || echo "ninguno OK"'' <- -o equivale OR |
| |
| | === parámetros |
| * ${@:param:num_param} -> coge desde <param> el número de parámetros indicado por <num_param> | * ${@:param:num_param} -> coge desde <param> el número de parámetros indicado por <num_param> |
| * permite acceder a parámetros más allá del 10 | * permite acceder a parámetros más allá del 10 |
| * @ indica todos -> (se podrá indicar otra cosa?) | * @ indica todos -> (se podrá indicar otra cosa?) |
| |
| * recorrer una cadena palabra a palabra:<code> | === ejemplos |
| cadena="Esto es una cadena" | * recorrer una cadena palabra a palabra: |
| | * <code bash>cadena="Esto es una cadena" |
| arr=($cadena) | arr=($cadena) |
| for i in ${arr[@]}; do echo $i; done | for i in ${arr[@]}; do echo $i; done |
| </code> | </code> |
| <code> | *<code bash> |
| cadena="Esto es una cadena" | cadena="Esto es una cadena" |
| for i in ${cadena[@]}; do echo $i; done | for i in ${cadena[@]}; do echo $i; done |
| </code> | </code> |
| | * subcadena en cadena : ''[[ $string =~ $substring ]]'' |
| | |
| == Operaciones sobre nombres de ficheros: | == Operaciones sobre nombres de ficheros: |
| partiendo de esta cadena: ''foo=/tmp/mi.directorio/imagen.png'' | partiendo de esta cadena: ''foo=/tmp/mi.directorio/imagen.png'' |
| * [[http://rm-rf.es/unix-uso-del-comando-cut/]] | * [[http://rm-rf.es/unix-uso-del-comando-cut/]] |
| |
| == indirection | |
| usar el valor de una variable para acceder al contenido de otra | |
| <code bash> | |
| # declaramos 2 variables | |
| export xyzzy=plugh ; export plugh=cave | |
| |
| echo ${xyzzy} # normal, xyzzy to plugh -> plugh | |
| |
| echo ${!xyzzy} # indirection, xyzzy to plugh to cave -> cave | |
| </code> | |
| |
| existen 2 casos en el que este comportamiento se ve modificado: | |
| * ''${!N*}'' : muestra las variables que empiecen por N | |
| * ''${!name[@]}'' | |
| |
| <code bash> | |
| export myVar="hi" | |
| echo ${!my*} # myVar | |
| |
| export ${!my*}="bye" | |
| echo $myVar # bye | |
| </code> | |
| |
| /vía: [[https://stackoverflow.com/questions/8515411/what-is-indirect-expansion-what-does-var-mean]] | |
| |
| == bash shell expansion | == bash shell expansion |
| ^ comando ^ descripción ^ | ^ comando ^ descripción ^ |
| | ''${Var}'' | variable | | | ''${var}'' | variable | |
| | ''${!Var}'' | Indirect expansion | | | ''${!var}'' | Indirect expansion | |
| | ''${!Var@}'' | Prefix expansion | | | ''${!var@}'' | Prefix expansion | |
| | ''${!Var[@]}''| Array keys expansion | | | ''${!var[@]}''| Array keys expansion | |
| | ''${Var[@]}'' | Plain array expansion | | | ''${var[@]}'' | Plain array expansion | |
| |
| <code bash; title=indirection> | <code bash; title=indirection> |
| var_one=a-value | var_one=a-value |
| |
| echo "${varname}" # var_one | echo "${varname}" # var_one |
| echo "${!varname} and ${var_one}" # a-value and a-value | echo "${var_one}" # a-value |
| | echo "${!varname}" # a-value |
| </code> | </code> |
| |