tag picard musicbrainz mac kid3 español editar easytag linux bash if-statement grep brackets

linux - picard - ¿Cuándo es que las construcciones no requieren corchetes?



musicbrainz picard español (3)

También puede usar corchetes dobles [[ lugar de solo [

Lea más sobre esto aquí: http://mywiki.wooledge.org/BashFAQ/031 :

[ ("test" command) and [[ ("new test" command) are used to evaluate expressions. [[ works only in Bash, Zsh and the Korn shell, and is more powerful; [ and test are available in POSIX shells

Estoy haciendo algunos deberes para una clase de guiones de shell y tuve una pregunta pidiéndome que escribiera un guión que pruebe si el argumento ingresado es un nombre de variable de shell válido. La secuencia de comandos siguiente parece funcionar bien.

if echo "$1" | grep -v ".*[^A-Za-z_]" > /dev/null then echo yes else echo no fi

Entiendo que los corchetes son abreviados para la función de prueba en el shell de BASH. Mi problema es que, cuando intenté la secuencia de comandos anterior utilizando corchetes, recibí un error.

if [ echo "$1" | grep -v ".*[^A-Za-z_]" > /dev/null ]

El problema con esto (creo) es que grep está tratando de usar el argumento], lo que da como resultado un error cuando se ejecuta el script.

¿En qué situaciones no necesito los corchetes?


[ / test es un comando (también incorporado), como dijiste. Es un comando que acepta argumentos de un tipo específico y se comporta de una manera específica dados esos argumentos.

Acepta indicadores y operadores de comparación y opera sobre aquellos para obtener un resultado true o false . Luego traduce ese resultado en un código de retorno. 0 para true y 1 para false .

La construcción if en el shell está definida

si lista; luego lista; [lista elif; luego lista; ] ... [otra lista; ] fi

La lista if se ejecuta. Si su estado de salida es cero, se ejecuta la lista. De lo contrario, cada lista elif se ejecuta sucesivamente, y si su estado de salida es cero, se ejecuta la lista correspondiente y el comando finaliza. De lo contrario, se ejecuta la lista else, si está presente. El estado de salida es el estado de salida del último comando ejecutado, o cero si ninguna condición es verdadera.

Entonces cuando [ / test devuelve un código de salida que es lo if evalúa.

La razón por la que no necesita (y no puede usar) [ alrededor del comando echo / pipeline es porque ese no es un conjunto válido de [ argumentos. En cambio, es una list comandos en sí misma y, como tal, no necesita ser evaluada por [ . Simplemente puede usarlo directamente y tener el código de retorno de la tubería entregado para if evaluación.


[ es en realidad un comando (que está integrado en la mayoría de las shells), no solo parte de la sintaxis de una sentencia if .

La instrucción if ejecuta el comando que es su argumento. Si ese comando tiene éxito (establece $? cero), entonces la condición es verdadera; si falla (establece $? en algún valor distinto de cero), la condición es falsa.

El comando [ incorporado es casi exactamente equivalente al comando de test ; la diferencia es que [ requiere ] como su último argumento.

Ver también https://unix.stackexchange.com/a/22728/10454