Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Ambdós costats versió prèvia Revisió prèvia
Següent revisió
Revisió prèvia
linux:bash:shellvariables [06/09/2018 08:27] – [Operaciones sobre cadenas] matelinux:bash:shellvariables [01/10/2024 03:53] (actual) – [Operaciones sobre cadenas] mate
Línia 1: Línia 1:
 = 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
  
Línia 24: Línia 25:
 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 |
Línia 50: Línia 40:
 | ${!prefijoVariable*}           | devuelve todas las variables declaradas que empiecen por prefijoVariable | | ${!prefijoVariable*}           | devuelve todas las variables declaradas que empiecen por prefijoVariable |
 | ${!prefijoVariable@}           | devuelve todas las variables declaradas que empiecen por prefijoVariable | | ${!prefijoVariable@}           | devuelve todas las variables declaradas que empiecen por prefijoVariable |
-para manipular, mirar **shell expasion pattern matching**+para manipular, mirar **shell expansion pattern matching** : [[https://www.cyberciti.biz/tips/bash-shell-parameter-substitution-2.html]]
  
-[[https://www.cyberciti.biz/tips/bash-shell-parameter-substitution-2.html]]+=== resumen expansion 
 +/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?
 +  * [[#simple_usage | Simple usage]]
 +    * ''$PARAMETER''
 +    * ''${PARAMETER}''
 +  * [[#indirection | Indirection]]
 +    * ''${!PARAMETER}''
 +  * [[#case_modification | Case modification ]]
 +    * ''${PARAMETER^}''
 +    * ''${PARAMETER^^}''
 +    * ''${PARAMETER,}''
 +    * ''${PARAMETER,,}''
 +    * ''${PARAMETER~}''
 +    * ''${PARAMETER~~}''
 +  * [[#variable_name_expansion | Variable name expansion]]
 +    * ''${!PREFIX*}''
 +    * ''${!PREFIX@}''
 +  * [[#substring_removal | Substring removal]] (also for **filename manipulation**!)
 +    * ''${PARAMETER#PATTERN}''
 +    * ''${PARAMETER##PATTERN}''
 +    * ''${PARAMETER%PATTERN}''
 +    * ''<nowiki>${PARAMETER%%PATTERN}</nowiki>''
 +  * [[#search_and_replace | Search and replace]]
 +    * ''${PARAMETER/PATTERN/STRING}''
 +    * ''<nowiki>${PARAMETER//PATTERN/STRING}</nowiki>''
 +    * ''${PARAMETER/PATTERN}''
 +    * ''<nowiki>${PARAMETER//PATTERN}</nowiki>''
 +  * [[#string_length | String length ]]
 +    * ''${#PARAMETER}''
 +  * [[#substring_expansion | Substring expansion]]
 +    * ''${PARAMETER:OFFSET}''
 +    * ''${PARAMETER:OFFSET:LENGTH}''
 +  * [[#use_a_default_value | Use a default value]]
 +    * ''${PARAMETER:-WORD}''
 +    * ''${PARAMETER-WORD}''
 +  * [[#assign_a_default_value | Assign a default value]]
 +    * ''${PARAMETER:=WORD}''
 +    * ''${PARAMETER=WORD}''
 +  * [[#use_an_alternate_value | Use an alternate value]]
 +    * ''${PARAMETER:+WORD}''
 +    * ''${PARAMETER+WORD}''
 +  * [[#display_error_if_null_or_unset | Display error if null or unset]]
 +    * ''${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}  +^ expresión                        ^ Significado                                                ^ Ejemplo                                                       
-| ''${cadena#subcadena}''             | eliminar subcadena del principio de la cadena            | echo ${string#substring                  +| ''${#parametro}''                | longitud de parámetro                                      | echo ${#string}                                               
-| ''${cadena%subcadena}''             | eliminar subcadena del final de la cadena                | echo ${string%substring                  +| ''${cadena:posición}''           | extrae subcadena desde posición                            | echo ${string:4}                                              
-| ''${cadena/s1/s2}''                 | reemplazar primera aparicion s1 por s2                                                            +| ''${cadena:posición:longitud}''  | extrae subcadena desde posición la longitud solicitada     | echo ${string:4:7} ; echo ${string::-1}                       
-| ''${cadena%%//%%s1/s2}''            | reemplazar todas aparicion s1 por s2                                                              +| ''${cadena#subcadena}''          | eliminar subcadena del principio de la cadena              | echo ${string#substring%%}%%                                  
-| ''${cadena/#s1/s2}''                | reemplazar si hay coincidencia al princpio de cadena                                              +| ''${cadena%subcadena}''          | eliminar subcadena del final de la cadena\\ permite uso *  | echo ${string%substring%%}%%\\ echo ${string%substring*%%}%%  
-| ''${cadena/%s1/s2}''                | reemplazar si hay coincidencia al final de cadena                                                 +| ''${cadena/s1/s2}''              | reemplazar primera aparicion s1 por s2                                                                                   
-| ''${cadena##*separador}''           | extrae el último elemento de la ristra, usando separador | %%data=foo,bar,baz;echo ${data##*,}%%    |+| ''${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
Línia 80: Línia 130:
     * @ 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''
Línia 104: Línia 157:
  
 == 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>
Línia 145: Línia 174:
 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>
  
  • linux/bash/shellvariables.1536247632.txt.gz
  • Darrera modificació: 06/09/2018 08:27
  • per mate