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