= Special Shell Variables & Parameter Substitution and Expansion
{{tag>linux}}{{tag>bash}}
**$** es utilizado para expansión de parámetros y sustitución de comandos
== File descriptors
== Special Shell Variables
^ variable ^ Significado ^
| $0 | Nombre del script que se está ejecutando |
| $1 | Parámetro 1 |
| $2 - $9 | Parámetros del 2 al 9 |
| ${10} | Parámetro 10 |
| $# | Número de parámetros |
| "$*" | Todos los parámetros en 1 cadena, ha de llevar " |
| "$@" | Todos los parámetros |
| ${#*} | Número de parámetros pasados (¿como $#?) |
| ${#@} | Número de parámetros pasados (¿como $#?) |
| $? | Valor de retorno |
| $$ | ID de proceso del script (PID) |
| $- | Flags pasados al script |
| $_ | Último argumento del comando anterior |
| $! | PID del último trabajo ejecutado en background |
Mirar también: [[http://wiki.bash-hackers.org/scripting/posparams]]
== Parameter substitution and Expansion
^ expresión ^ Significado ^
| ${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 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 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 o si es vacía, mostrando el mensaje de error y para la ejecución del script |
| ${variable+OTHER} | si el parámetro está establecido, se le asigna OTHER, en otro caso, NULL |
| ${variable:+OTHER} | si el parámetro está establecido, se le asigna OTHER, en otro caso, NULL |
| ${!prefijoVariable*} | devuelve todas las variables declaradas que empiecen por prefijoVariable |
| ${!prefijoVariable@} | devuelve todas las variables declaradas que empiecen por prefijoVariable |
para manipular, mirar **shell expansion pattern matching** : [[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}''
* ''${PARAMETER%%PATTERN}''
* [[#search_and_replace | Search and replace]]
* ''${PARAMETER/PATTERN/STRING}''
* ''${PARAMETER//PATTERN/STRING}''
* ''${PARAMETER/PATTERN}''
* ''${PARAMETER//PATTERN}''
* [[#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
* /vía: [[http://www.marqueta.org/cadenas-en-bash/]]
* /vía: [[https://tldp.org/LDP/abs/html/string-manipulation.html]]
* /via: [[https://itsfoss.com/es/cadenas-bash/]]
^ 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"'' <- idem anterior
* ''$ 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=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
=== parámetros
* ${@:param:num_param} -> coge desde el número de parámetros indicado por
* permite acceder a parámetros más allá del 10
* ''${@:7:2}'' -> devuelve $7 y $8
* @ indica todos -> (se podrá indicar otra cosa?)
=== ejemplos
* recorrer una cadena palabra a palabra:
* cadena="Esto es una cadena"
arr=($cadena)
for i in ${arr[@]}; do echo $i; done
*
cadena="Esto es una cadena"
for i in ${cadena[@]}; do echo $i; done
* subcadena en cadena : ''[[ $string =~ $substring ]]''
== Operaciones sobre nombres de ficheros:
partiendo de esta cadena: ''foo=/tmp/mi.directorio/imagen.png''
* ''path = ${foo%/*}'' -> "/tmp/mi.directorio"
* ''file = ${foo##*/}'' -> "imagen.png"
* ''base = ${file%%.*}'' -> "imagen"
* hint: si la cadena tiene más de un ".", usar ''base=${file%.*}''
* ''ext = ${file#*.}'' <- en este caso, devolvería: "directorio/imagen.png", cogiendo desde el primer punto que encuenta
* hint: si la cadena tiene más de un ".", usar ''ext=${file##*.}''-> "png"
== Operaciones con cadenas (varios)
* extraer información de procesos: ''ps -L u n | tr -s " " | cut -d " " -f 2,3,14-''
* [[http://stackoverflow.com/questions/15643834/using-bash-ps-and-cut-together]]
== Operaciones con cadenas desde bash
* [[http://www.marqueta.org/cadenas-en-bash/]]
* [[http://stackoverflow.com/questions/428109/extract-substring-in-bash]]
* [[http://rm-rf.es/unix-uso-del-comando-cut/]]
== bash shell expansion
^ comando ^ descripción ^
| ''${var}'' | variable |
| ''${!var}'' | Indirect expansion |
| ''${!var@}'' | Prefix expansion |
| ''${!var[@]}''| Array keys expansion |
| ''${var[@]}'' | Plain array expansion |
varname=var_one
var_one=a-value
echo "${varname}" # var_one
echo "${var_one}" # a-value
echo "${!varname}" # a-value
head_one=foo
head_two=bar
printf '<%s> ' "${!head@}" #
printf '<%s> ' "${!head*}" #
nota: las variables están enganchdas por un espacio, que es el valor por defecto de IFS (espacio, tabulador, nueva_linea)
Array[1]=This
Array[2]=is
Array[3]=a
Array[4]=simple
Array[5]=test.
printf '<%s> ' "${Array[@]}" #
printf '<%s> ' "${Array[*]}" #
unset Array # erase any notion of variable array.
declare -A Array # make it associative
Array=([foo]=one [bar]=two [baz]=three) # give it values.
printf '<%s> ' "${Array[@]}" # # List of values.
$ printf '<%s> ' "${!Array[@]}" # # List of keys
$ printf '<%s> ' "${Array[*]}" # # One string of list of values.
$ printf '<%s> ' "${!Array[*]}" # # One string of list of keys.
/vía: [[https://unix.stackexchange.com/questions/247589/usage-of-in-parameter-expansion]]