La lista de ‘si’ cambia a alguna parte?

¿Hay una lista de todos los switches if para usar en scripts bash? A veces veo a alguien usándolo y me pregunto qué hace el interruptor que están usando.

Ejemplo es la -z en este caso. Sé cómo usarlo, pero no sé de dónde se deriva.

 if [ -z "$BASH_VERSION" ]; then echo -e "Error: this script requires the BASH shell!" exit 1 fi 

Se apreciarán todas las referencias, guías, publicaciones, respuestas.

Mira la página de man bash ( man bash ). Las opciones se especifican en la sección CONDITIONAL EXPRESSIONS :

 CONDITIONAL EXPRESSIONS Conditional expressions are used by the [[ compound command and the test and [ builtin commands to test file attributes and perform string and arithmetic comparisons. Expressions are formed from the following unary or binary primaries. If any file argument to one of the pri- maries is of the form /dev/fd/n, then file descriptor n is checked. If the file argument to one of the primaries is one of /dev/stdin, /dev/stdout, or /dev/stderr, file descriptor 0, 1, or 2, respectively, is checked. Unless otherwise specified, primaries that operate on files follow sym- bolic links and operate on the target of the link, rather than the link itself. -a file True if file exists. ... more options ... 

También se explica en la ayuda:

 $ help [ [: [ arg... ] This is a synonym for the "test" builtin, but the last argument must be a literal `]', to match the opening `['. 

Sí. Estas se llaman expresiones condicionales y estas son usadas por el [[ Comando compuesto y la test y [ comandos integrados ( [ es simplemente un sinónimo de test ).

Lea la sección 6.4 Bash Expresiones Condicionales del Manual de Referencia de Bash , que contiene una lista de todos estos interruptores y su uso.

No son interruptores para la instrucción if , sino para el comando de test ( [ es un sinónimo de la test integrada de test ). Vea la help test en bash para obtener una lista completa.

De hecho, no if así if eso está proporcionando eso, es [ , mejor conocido por el nombre de test . help test debería darle una lista de todas las opciones que puede tomar. También puedes mirar el estándar , si te importa.

Los corchetes simples ( [ ... ] ) son un sinónimo del comando de test . Si miras la página de manual para la prueba , verás casi todo (BASH podría tener algunos extra no mencionados aquí) de los diversos conmutadores if como los llamaste. Todo en un lugar fácil de encontrar.

Si usa corchetes dobles ( [[ ... ]] ), está utilizando un conjunto extendido de pruebas de BASH. Estos tienen que ver principalmente con el emparejamiento de expresiones regulares y el emparejamiento global (y el emparejamiento global extendido si tiene ese conjunto también). Para eso, tendrás que leer esa página de BASH.

Usted los llamó si cambia , pero eso no es realmente correcto. Estas son pruebas y realmente no tienen nada que ver con el comando if .

El comando if simplemente ejecuta el comando que le da, y luego si ese comando devuelve un código de salida de 0 , ejecutará la porción if de la instrucción if . De lo contrario, ejecutará la parte else (si está presente).

Veamos esto:

 $ rm foo.test.txt # Hope this wasn't an important file $ if ls foo.test.txt > then > echo "This file exists" > else > echo "I can't find it anywhere.." > fi ls: foo.test.txt: No such file or directory I can't find it anywhere.. 

La instrucción if ejecuta el ls foo.test.txt y el comando ls devuelve un valor distinto de cero porque el archivo no existe. Esto hace que la instrucción if ejecute la cláusula else .

Probemos eso de nuevo …

 $ touch foo.test.txt # Now this file exists. $ if ls foo.test.txt # Same "if/else" statement as above > then > echo "This file exists" > else > echo "I can't find it anywhere.." > fi foo.test.txt This file exists 

Aquí, el comando ls devolvió un estado de salida 0 (dado que el archivo existe y el archivo existe y puede ser clasificado por el comando ls .

Normalmente, no debe usar el comando ls para probar un archivo. Simplemente lo usé aquí para mostrar que la instrucción if ejecuta el comando, luego ejecuté la cláusula if o else dependiendo del estado de salida de ese comando. Si desea probar si existe o no un archivo, debe usar el comando test -e lugar del comando ls :

 if test -e foo.test.txt # Same as above, but using "test" instead of "ls" then echo "This file exists" else echo "I can't find it anywhere.." fi 

Si el archivo existe, la test -e devolverá un estado de salida de 0 . De lo contrario, devolverá un estado de salida distinto de cero.

Si haces esto:

 $ ls -i /bin/test /bin/[ 10958 /bin/[ 10958 /bin/test 

Ese 10958 es el inodo . Los archivos con el mismo inodo son dos nombres diferentes para el mismo archivo. Por lo tanto, [ y el comando de test tienen un enlace suave 1 . Esto significa que puede usar [ lugar de test :

 if [ -e foo.test.txt ] then echo "This file exists" else echo "I can't find it anywhere.." fi 

¿Luce familiar?


1. En BASH, la test y [ están incorporados, por lo que cuando ejecuta estos comandos en BASH, no se está ejecutando /bin/test o /bin/[ . Sin embargo, todavía están vinculados entre sí.