Неожиданный результат a = «$ @»

Выполнение шагов обновления 2 не помогло, но как только появилось другое меню GRUB, я смог загрузиться в ОС.

Это не техническое исправление данной ошибки, но это было мое исправление.

7
18.05.2018, 19:50
1 ответ

Por lo que puedo decir, POSIX deja $@en una asignación indefinida , por lo que no es realmente un error, excepto quizás en la documentación de Bash. $@se define en dos casos:

  • When the expansion occurs in a context where field splitting will be performed...
  • When the expansion occurs within double-quotes, the behavior is unspecified unless [...] Field splitting would be performed [...] (*)

Pero,

In all other contexts the results of the expansion are unspecified.

La división de campos no ocurre en una tarea y no ocurriría incluso sin las comillas dobles, por lo que no está definido.


Ahora, asumo que a="$@"actúa de la misma manera que a="$*"porque expandirse a múltiples palabras realmente no tendría ningún sentido aquí. No puede asignar varias palabras a una variable regular como entidades distintas, y asignar una pero usar el resto como argumentos de comando sería confuso y propenso a errores.

Como dice la página de shellcheck, el comportamiento de "$@"en una asignación difiere entre shells. Bash y ksh unen los parámetros posicionales con espacios, zsh y guión con la primera letra deIFS(exactamente como lo haría "$*").

$ bash -c 'set -- x y z; IFS=.; a="$@"; printf "<%s>\n" "$a"'
<x y z>
$ ksh93 -c 'set -- x y z; IFS=.; a="$@"; printf "<%s>\n" "$a"'
<x y z>
$ zsh -c 'set -- x y z; IFS=.; a="$@"; printf "<%s>\n" "$a"'
<x.y.z>
$ dash -c 'set -- x y z; IFS=.; a="$@"; printf "<%s>\n" "$a"'
<x.y.z>

Probablemente sea mejor usar a="$*"si desea unirse a una sola cadena o, de lo contrario, escribir explícitamente lo que desea.

(*u otro caso relacionado con ${parameter:-word}ampliaciones)

8
27.01.2020, 20:17

Теги

Похожие вопросы