Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia |
linux:bash:shellvariables [12/10/2018 02:24] – [Parameter substitution and Expansion] mate | 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 |
| |
Mirar también: [[http://wiki.bash-hackers.org/scripting/posparams]] | Mirar también: [[http://wiki.bash-hackers.org/scripting/posparams]] |
| |
== + variables | |
* ''a=${VAR:-20}'': asignar valor por defecto a **a** si **VAR** no existe (en este caso 20). Permite cadenas | |
| |
== arrays y tablas | |
* permite almacenar 1024 variables (de la 0 a la 1023) | |
* formato: | |
* setear: ''variable[n]='valor''' | |
* setear: ''variable=(valor valor valor valor)'' | |
* recuperar: ''VALOR=${variable[n]}'' | |
* recuperar: ''echo ${variable[n]}'' | |
* recuperar todos los valores: ''echo ${variable[*]}'' | |
* /via: [[http://ovtoaster.com/shell-scripts-en-linux-variables-y-parametros/]] | |
| |
== Parameter substitution and Expansion | == Parameter substitution and Expansion |
^ 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://example.com|Enllaç extern]]\\ | /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'' |
| |
== Operaciones con cadenas desde bash | == Operaciones con cadenas desde bash |
* [[http://www.marqueta.org/cadenas-en-bash/]] | * <del>[[http://www.marqueta.org/cadenas-en-bash/]]</del> |
* [[http://stackoverflow.com/questions/428109/extract-substring-in-bash]] | * [[http://stackoverflow.com/questions/428109/extract-substring-in-bash]] |
* [[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> |
| |