scripts script resueltos paso pasar parametros operaciones manejo hacer español ejercicios ejemplos como cadenas aritmeticas linux bash shell unix sh

linux - resueltos - ¿Qué significa $ @ en un script de shell?



scripts linux ejercicios resueltos (5)

¿Qué significa un signo de dólar seguido de un signo ( @ ) en un guión de shell?

Por ejemplo:

umbrella_corp_options $@


El uso de un $@ puro significa en la mayoría de los casos "dañar al programador tan duro como sea posible", porque en la mayoría de los casos conduce a problemas con la separación de palabras y con espacios y otros caracteres en los argumentos.

En (supuestamente) el 99% de todos los casos, se requiere encerrarlo en " : "$@" es lo que se puede usar para iterar confiablemente sobre los argumentos.

for a in "$@"; do something_with "$a"; done


Estos son los argumentos de línea de comandos donde:

$@ = almacena todos los argumentos en una lista de cadenas
$* = almacena todos los argumentos como una sola cadena
$# = almacena la cantidad de argumentos


Del manual:

@

Se expande a los parámetros posicionales, comenzando desde 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).


$@ es todos los parámetros pasados ​​al script.

Por ejemplo, si llama a ./someScript.sh foo bar entonces $@ será igual a foo bar .

Si lo haces:

./someScript.sh foo bar

y luego dentro de someScript.sh referencia someScript.sh :

umbrella_corp_options "$@"

esto se pasará a umbrella_corp_options con cada parámetro individual entre comillas dobles, lo que permite tomar los parámetros con espacio en blanco de la persona que llama y pasarlos.


$@ es casi lo mismo que $* , ambos significan "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 (por ejemplo) y pone $@ entre comillas dobles:

wrappedProgram "$@" # ^^^ 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: llamadas

wrapper "one two three" four five "six seven"

resultará en:

"$@": wrappedProgram "one two three" four five "six seven" "$*": wrappedProgram "one two three four five six seven" ^^^^ These spaces are part of the first argument and are not changed. $*: wrappedProgram one two three four five six seven