scripts script resueltos paso pasar parametros manejo hacer espaƱol ejercicios ejemplos como cadenas bash shell

resueltos - Comprobar la existencia de un argumento de entrada en un script de shell Bash



scripts linux ejercicios resueltos (9)

A menudo uso este fragmento de código para scripts simples:

#!/bin/bash if [ -z "$1" ]; then echo -e "/nPlease call ''$0 <argument>'' to run this command!/n" exit 1 fi

Necesito verificar la existencia de un argumento de entrada. Tengo el siguiente guion

if [ "$1" -gt "-1" ] then echo hi fi

yo obtengo

[: : integer expression expected

¿Cómo verifico primero el argumento de entrada1 para ver si existe?


Como un pequeño recordatorio, los operadores de prueba numéricos en Bash solo funcionan en enteros ( -eq , -lt , -ge , etc.)

Me gusta asegurarme de que mis $ vars son ints por

var=$(( var + 0 ))

antes de probarlos, solo para defenderme del error "[: integer arg required").


Es mejor demostrar de esta manera

if [[ $# -eq 0 ]] ; then echo ''some message'' exit 1 fi

Normalmente necesitas salir si tienes muy pocos argumentos.


Es:

if [ $# -eq 0 ] then echo "No arguments supplied" fi

La variable $# le dirá la cantidad de argumentos de entrada que se pasó la secuencia de comandos.

O puede verificar si un argumento es una cadena vacía o no como:

if [ -z "$1" ] then echo "No argument supplied" fi

El -z probará si la expansión de "$ 1" es una cadena nula o no. Si es una cadena nula, entonces se ejecuta el cuerpo.


Otra forma de detectar si los argumentos se pasaron al script:

((!$#)) && echo No arguments supplied!

Tenga en cuenta que (( expr )) hace que la expresión se evalúe según las reglas de Shell Arithmetic .

Para salir en ausencia de cualquier argumento, se puede decir:

((!$#)) && echo No arguments supplied! && exit 1

Otra forma (análoga) de decir lo anterior sería:

let $# || echo No arguments supplied let $# || { echo No arguments supplied; exit 1; } # Exit if no arguments!

help let decir:

let: let arg [arg ...]

Evaluate arithmetic expressions. ... Exit Status: If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.


Si desea verificar si el argumento existe, puede verificar si el número de argumentos es mayor o igual a su número de argumento objetivo.

La siguiente secuencia de comandos demuestra cómo funciona esto

test.sh

#!/usr/bin/env bash if [ $# -ge 3 ] then echo script has at least 3 arguments fi

produce la siguiente salida

$ ./test.sh ~ $ ./test.sh 1 ~ $ ./test.sh 1 2 ~ $ ./test.sh 1 2 3 script has at least 3 arguments $ ./test.sh 1 2 3 4 script has at least 3 arguments


Si solo está interesado en detectar si falta un argumento en particular, la sustitución de parámetros es excelente:

#!/bin/bash # usage-message.sh : ${1?"Usage: $0 ARGUMENT"} # Script exits here if command-line parameter absent, #+ with following error message. # usage-message.sh: 1: Usage: usage-message.sh ARGUMENT

En algunos casos, debe verificar si el usuario pasó un argumento a la secuencia de comandos y, de no ser así, volver a un valor predeterminado. Como en el siguiente script:

scale=${2:-1} emulator @$1 -scale $scale

Aquí, si el usuario no ha pasado la scale como segundo parámetro, -scale 1 emulador de Android con -scale 1 de manera predeterminada. ${varname:-word} es un operador de expansión. También hay otros operadores de expansión:

  • ${varname:=word} que establece el varname no varname lugar de devolver el valor de la word ;
  • ${varname:?message} que devuelve varname si está definido y no es nulo o imprime el message y cancela el script (como el primer ejemplo);
  • ${varname:+word} que devuelve word solo si varname está definido y no es nulo; devuelve nulo de lo contrario.

Solo porque hay un punto base más para señalar, agregaré que simplemente puede probar que su cadena es nula:

if [ "$1" ]; then echo yes else echo no fi

Del mismo modo, si estás esperando un conteo de arg, prueba tu último:

if [ "$3" ]; then echo has args correct or not else echo fixme fi

y así sucesivamente con cualquier arg o var


Tratar:

#!/bin/bash if [ "$#" -eq "0" ] then echo "No arguments supplied" else echo "Hello world" fi