Tengo un script bash que dice algo como esto:
#!/bin/bash
if [ $1 = "--test" ] || [ $1 = "-t" ]; then
echo "Testing..."
testing="y"
else
testing="n"
echo "Not testing."
fi
Entonces, lo que quiero poder hacer no es solo ejecutarlo con ./script --test
o ./script -t
, sino también sin argumentos (solo ./script
), sino que aparentemente si hago eso con el código actual, la salida es solo:
./script: line 3: [: =: unary operator expected
./script: line 3: [: =: unary operator expected
Not testing.
Entonces, ¿cómo lo programo para que ejecutarlo sin argumentos lo haga else
sin arrojar el error? ¿Qué estoy haciendo mal?
command-line
bash
scripts
Peter Cordes
fuente
fuente
Respuestas:
La "forma correcta" de usar opciones largas en el script de shell es a través de la utilidad getopt GNU . También hay getopts que es un bash incorporado , pero solo permite opciones cortas como
-t
. Algunos ejemplos degetopt
uso se pueden encontrar aquí .Aquí hay un script que demuestra cómo abordaría su pregunta. La explicación de la mayoría de los pasos se agrega como comentarios dentro del script.
Con algunas simplificaciones y comentarios eliminados, esto se puede condensar en:
fuente
Varias formas; Los dos más obvios son:
$1
entre comillas dobles:if [ "$1" = "--test" ]
Mejor aún, usa getopts.
fuente
[ "x$1" = "x--test" ]
defender nuevamente los argumentos de la línea de comandos que son operadores válidos para el[
comando. (Esta es otra razón por la que[[ ]]
se prefiere: es parte de la sintaxis de shell, no solo un comando incorporado.)Debe citar sus variables dentro de la condición if. Reemplazar:
con:
Entonces funcionará:
¡Siempre siempre comillas dobles tus variables!
fuente
foo=bar echo '$foo'
impresiones de expansión variable$foo
en la salida, sino que sefoo=bar echo "$foo"
imprime en subar
lugar.Estás usando bash. Bash tiene una gran alternativa a
[
:[[
. Con esto[[
, no tiene que preocuparse por las cotizaciones, y obtiene muchos más operadores que[
, incluido el soporte adecuado para||
:O puede usar expresiones regulares:
Por supuesto, siempre se debe hacer una cita adecuada, pero no hay razón para seguir
[
cuando se usa bash.fuente
Para probar si hay argumentos presentes (en general, y hacer las acciones en consecuencia) Esto debería funcionar:
fuente
[ -z "$1" ]
?$check
una vez, antes de cualquiershift
s, por lo que sería mejor usarla$1
.#!
cuando proporcione muestras (debe describir el shell fuera del código).