resueltos - scripts bash ejemplos
La lista de ''si'' cambia a alguna parte? (5)
¿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.
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í.
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 `[''.
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.
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.