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 ».«, 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-
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