Special Shell Variables & Parameter Substitution and Expansion
$ 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?
- 
- $PARAMETER
- ${PARAMETER}
 
- 
- ${!PARAMETER}
 
- 
- ${PARAMETER^}
- ${PARAMETER^^}
- ${PARAMETER,}
- ${PARAMETER,,}
- ${PARAMETER~}
- ${PARAMETER~~}
 
- 
- ${!PREFIX*}
- ${!PREFIX@}
 
- Substring removal (also for filename manipulation!)- ${PARAMETER#PATTERN}
- ${PARAMETER##PATTERN}
- ${PARAMETER%PATTERN}
- ${PARAMETER%%PATTERN}
 
- 
- ${PARAMETER/PATTERN/STRING}
- ${PARAMETER//PATTERN/STRING}
- ${PARAMETER/PATTERN}
- ${PARAMETER//PATTERN}
 
- 
- ${#PARAMETER}
 
- 
- ${PARAMETER:OFFSET}
- ${PARAMETER:OFFSET:LENGTH}
 
- 
- ${PARAMETER:-WORD}
- ${PARAMETER-WORD}
 
- 
- ${PARAMETER:=WORD}
- ${PARAMETER=WORD}
 
- 
- ${PARAMETER:+WORD}
- ${PARAMETER+WORD}
 
- 
- ${PARAMETER:?WORD}
- ${PARAMETER?WORD}
 
+info: Referencias indirectas
Operaciones sobre cadenas
| 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 <param> el número de parámetros indicado por <num_param>- 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 ».«, usarbase=${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 ».«, usarext=${file##*.}→ «png»
 
Operaciones con cadenas (varios)
- extraer información de procesos:ps -L u n | tr -s » « | cut -d » « -f 2,3,14-
Operaciones con cadenas desde bash
bash shell expansion
| comando | descripción | 
|---|---|
| ${var} | variable | 
| ${!var} | Indirect expansion | 
| ${!var@} | Prefix expansion | 
| ${!var[@]} | Array keys expansion | 
| ${var[@]} | Plain array expansion | 
- title=indirection
- varname=var_one var_one=a-value echo "${varname}" # var_one echo "${var_one}" # a-value echo "${!varname}" # a-value 
- title=prefix
- head_one=foo head_two=bar printf '<%s> ' "${!head@}" # <head_one> <head_two> printf '<%s> ' "${!head*}" # <head_one head_two> 
nota: las variables están enganchdas por un espacio, que es el valor por defecto de IFS (espacio, tabulador, nueva_linea)
- title=plain array
- Array[1]=This Array[2]=is Array[3]=a Array[4]=simple Array[5]=test. printf '<%s> ' "${Array[@]}" # <This> <is> <a> <simple> <test.> printf '<%s> ' "${Array[*]}" # <This is a simple test.> 
- title= array associative list
- 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[@]}" # <two> <three> <one> # List of values. $ printf '<%s> ' "${!Array[@]}" # <bar> <baz> <foo> # List of keys $ printf '<%s> ' "${Array[*]}" # <two three one> # One string of list of values. $ printf '<%s> ' "${!Array[*]}" # <bar baz foo> # One string of list of keys. 
/vía: https://unix.stackexchange.com/questions/247589/usage-of-in-parameter-expansion