He leído que el punto y coma se usa para separar programas:
$ echo 3; ls -la
¿Significa eso if
, then
y else
hay programas separados aquí?
$ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi
Esta pregunta no es sobre punto y coma.
bash
shell-script
shell
Maxim Koretskyi
fuente
fuente
[ $variable == abcdef ] && echo yes || echo no
Respuestas:
Las
;
declaraciones separadas (hablando libremente). Es (casi) siempre posible reemplazar a;
por una nueva línea.Decir que
;
separa dos programas, por lo tanto,if
ythen
debe ser "programas" es un poco demasiado simplista, ya que se puede hacer una declaración de palabras reservadas, funciones de shell, utilidades integradas y utilidades externas, y combinaciones de estas utilizando tuberías y operadores booleanos, etc. etc.Ambas
if
ythen
son palabras reservadas en la gramática del shell , no "programas". Aquí se usan para construir lo que técnicamente se llama un comando compuesto .echo
es probable que sea una utilidad incorporada en el shell (pero no es necesario que lo sea), yls
es probable que sea una utilidad externa (o "programa" como usted dice).fuente
Si bien esa es una primera aproximación justa cuando uno comienza a aprender los conceptos básicos del uso de shells, en el nivel de "así es como se ejecuta un programa" y "así es como se ejecutan varios programas uno tras otro en una sola línea" , en realidad no es cierto.
La explicación más difícil de entender para un principiante pero más correcta es que el lenguaje shell es un lenguaje de computadora . Tiene una sintaxis . Esa sintaxis comprende varios elementos léxicos que incluyen (entre otras cosas) nuevas líneas, operadores, palabras y palabras reservadas.
if
,then
,else
, Yfi
son todas las palabras reservadas . Tienen un significado particular al analizar la entrada que se le da a un shell, de acuerdo con su gramática . Del mismo modo,;
es un operador separador .Por lo tanto, la entrada en el lenguaje shell es, en su conjunto, un programa informático interpretado por otro programa, un intérprete , el shell. Sus partes gramaticales individuales no son programas. El lenguaje de shell es una forma de especificar (otros) programas para que se ejecute el shell.
[
no es un elemento léxico especial en la gramática de la shell, como un operador. Es una palabra ordinaria , que nombra uno de esos programas llamado[
. Muchos shells tienen una versión integrada de este programa, combinada con el código del propio programa de shell, pero también puede encontrar un programa externo con este nombre en algún lugar como/bin/[
o/usr/bin/[
, qué programas que no sean shells pueden invocar. Igualmente,]
tampoco es un elemento léxico especial de shell. Es una palabra ordinaria, que se convierte en un argumento para el[
programa. El[
programa requiere que su argumento final, cuando se ejecuta, sea]
, el cual procede a ignorar.Otro programa similar nombrado en su pregunta es
echo
. Nuevamente, la mayoría de los shells tienen una versión incorporada de este programa. Pero, de nuevo, también hay una versión externa del programa, en algún lugar como/bin/echo
o/usr/bin/echo
, para que invoquen otros programas que no sean shells.Un tercer programa nombrado en su pregunta es
ls
. Los shells generalmente no tienen versiones integradas de este programa, y es un programa externo que se puede encontrar en algún lugar como/bin/ls
o/usr/bin/ls
.Para el shell Bourne Again, puede leer más sobre esto en las Características básicas del shell de la documentación de información del shell GNU Bourne Again. Otras conchas tienen diferentes gramáticas, naturalmente. La especificación Single Unix describe una sintaxis a la que se supone que se adhieren todos los shells conformes con POSIX (en sus modos conformes con POSIX).
Otras lecturas
test
. Utilidades . Especificaciones básicas Problema 7. El grupo abierto. IEEE 1003.1-2008. ISBN 1937218812.fuente
En realidad, no es descabellado pensar
if
,then
yelse
como los programas externos. De hecho, el shell Thompson en la primera edición original de Unix implementadoif
ygoto
como programas externos. Esto es posible porque el subproceso comparte descriptores de archivo con el proceso de shell, por lo que un goto (hacia adelante) solo tuvo que leer la entrada hasta que encuentra la etiqueta de destino y luego sale. Ver Thompson shell .fuente
if
yifelse
, que son parte deexecline
. Sinif
embargo, estos no están en la pregunta.Los
then
yelse
no son programas. Las otras partes son. Observe que no hay;
'directamente después de ellos, pero después del comando preceden.El
[ ... ]
es un comando, y necesita el;
if seguido por el comienzo de otro comando.AFAIK, todas las estructuras de control en Bash, y probablemente la mayoría de los proyectiles * nix, son iguales. Son instrucciones para el intérprete. La prueba o condición, por otro lado, utiliza un programa / proceso que se "ejecuta" y son comandos. Como
then
es parte de la línea que conduce alecho
comando, debe estar separada por una nueva línea del comando anterior[ ... ]
. No necesita separarse del comando que controla, elecho yes
.Legalmente, aunque feo y difícil de leer, también puedes hacer esto.
Tenga en cuenta que no hay necesidad de ningún
;
control entre los controles aquí, aunque no estén en su propia línea.Curiosamente, toda la estructura de control (
if ... fi
) es un comando de shell, y la totalidad tiene que terminar con una nueva línea o un;
. La última línea no puede ser,fi echo done
pero debe serfi; echo done
. Lo mismo que una asignaciónVARIABLE='abcdef'
es un comando.Aunque todas las estructuras de control son comandos, aún no son programas.
fuente
if
,elif
,then
, Yfi
son todas las palabras clave reservadas utilizados para implementar uno de los constructos que se refiere como un comando compuesto en cáscara, lo que significa que no puede haber un comando (o más bien, otro comando) por cualquiera de esos nombres con cáscara. El propósito de;
en general no es separar los comandos, sino terminar una lista de comandos . Por ejemplo, la siguiente es unaif
declaración válida :La condición de la
if
declaración es la lista de comandosecho foo; echo bar; echo baz
. El analizador sabe que la condición ha terminado porquethen
, que sigue inmediatamente a un punto y coma, no puede ser un comando porque es una palabra clave reservada. Por lo tanto, sabe que lo que siguethen
es el inicio del cuerpo. Del mismo modo,fi
es una palabra clave reservada y, por lo tanto, no puede ser un tercer comando en el cuerpo de laif
declaración, pero marca el final del comando compuesto.fuente
if program1 foo; program2 bar; program3 baz;
, ¿qué estado del programa debería ser0
, para que el shell continúethen
? ¿El último?program3 baz
. El estado de salida de una lista de comandos es el estado de salida del último comando en esa lista. Los otros dos pueden fallar sin afectar la condición.