¿Qué significa un signo de dólar seguido de un signo al (@
) en un script de shell?
Por ejemplo:
umbrella_corp_options [email protected]
¿Qué significa un signo de dólar seguido de un signo al (@
) en un script de shell?
Por ejemplo:
umbrella_corp_options [email protected]
[email protected]
es todo de los parámetros pasados al script.
Por ejemplo, si llama a ./someScript.sh foo bar
, entonces [email protected]
será igual a foo bar
.
Si lo hace:
./someScript.sh foo bar
y luego dentro someScript.sh
referencia:
umbrella_corp_options "[email protected]"
esto se pasará a umbrella_corp_options
con cada parámetro individual entre comillas dobles, lo que permite tomar parámetros con espacio en blanco de la persona que llama y páselos.
@
se expande a la parámetros posicionales, a partir de uno. Cuando la expansión ocurre entre comillas dobles, cada parámetro se expande a una palabra separada. Es decir, "$ @" es equivalente a "$ 1" "$ 2" .... Si la expansión de comillas dobles ocurre dentro de una palabra, la expansión del primer parámetro se une con la parte inicial de la palabra original, y el la expansión del último parámetro se une con la última parte de la palabra original. Cuando no hay parámetros posicionales, "$ @" y $ @ se expanden a nada (es decir, se eliminan).
el uso de un [email protected]
puro significa en la mayoría de los casos "daño al programador tan duro como sea posible", porque en la mayoría de los casos conduce a problemas con la separación de la palabra y con espacios y otros caracteres en los argumentos.
En (adivinado) el 99% de todos los casos, se requiere encerrarlo en "
: "[email protected]"
es lo que se puede usar para iterar confiablemente sobre los argumentos.
for a in "[email protected]"; do something_with "$a"; done
[email protected]
es casi la misma que $*
, tanto significa "todos los argumentos de línea de comando". A menudo se usan para pasar simplemente todos los argumentos a otro programa (formando así un envoltorio alrededor de ese otro programa).
La diferencia entre las dos sintaxis aparece cuando tiene un argumento con espacios en él (p. Ej.) Y poner [email protected]
en comillas dobles:
wrappedProgram "[email protected]"
# ^^^ this is correct and will hand over all arguments in the way
# we received them, i. e. as several arguments, each of them
# containing all the spaces and other uglinesses they have.
wrappedProgram "$*"
# ^^^ this will hand over exactly one argument, containing all
# original arguments, separated by single spaces.
wrappedProgram $*
# ^^^ this will join all arguments by single spaces as well and
# will then split the string as the shell does on the command
# line, thus it will split an argument containing spaces into
# several arguments.
Ejemplo: Llamada
wrapper "one two three" four five "six seven"
resultará en:
"[email protected]": wrappedProgram "one two three" four five "six seven"
"$*": wrappedProgram "one two three four five six seven"
$*: wrappedProgram one two three four five six seven
Son * no * lo mismo, y la página de manual es clara sobre los efectos secundarios de $ * utilizando IFS, que no es necesariamente espacio. (Si fueran lo mismo, no tendría ningún sentido, aparte de la compatibilidad, ofrecer ambos.) –
No, no lo son. Y lo dije dos líneas a continuación: "La diferencia entre los dos ..." Para obtener oraciones cortas y aumentar la legibilidad, el lector tiene que leer más de una oración antes de emitir un veredicto: -/ – Alfe
Alfe, la inserción de Christoffer de eso una palabra "casi" marcó una gran diferencia, sin sacrificar la precisión ni la legibilidad. De hecho, superé esta respuesta (en oposición a la aceptada) exactamente debido a ese énfasis sutil de la * diferencia * ... ¡antes de darme cuenta de que era casi en contra de tu voluntad! ;) –
Estos son los argumentos de línea de comandos donde:
[email protected]
= almacena todos los argumentos en una lista de cadena
$*
= almacena todos los argumentos como una única cadena
$#
= almacena el número de argumentos
Tienes '$ @' y '$ *' al revés – iruvar
posible duplicado de [lo que es $ @ o la búsqueda de una explicación de $ @ en bash] (http://stackoverflow.com/questions/3898665/what-is-or-searching-for-an-explaination-of-in-bash) – l0b0