Verificați numărul de argumente transmise unui script Bash

Aș dori să-mi script Bash pentru a imprima un mesaj de eroare dacă este necesar argument numărul nu este cunoscut.

Am incercat codul de mai jos:

#!/bin/bash
echo Script name: $0
echo $# arguments 
if [$# -ne 1]; 
    then echo "illegal number of parameters"
fi

Pentru un motiv necunoscut am'am primit urmatoarea eroare:

test: line 4: [2: command not found

Ce fac gresit?

Comentarii la întrebare (8)
Soluția

La fel ca orice altă comandă simplă, ` [ ... ] " sau " test necesită spații între argumentele sale.

if [ "$#" -ne 1 ]; then
    echo "Illegal number of parameters"
fi

Sau

if test "$#" -ne 1; then
    echo "Illegal number of parameters"
fi

Sugestii

Când în Bash, prefera folosind [[ ]] în loc ca ea nu't face cuvânt de divizare și cale de extindere a acesteia variabile care citezi nu pot fi necesare dacă nu's parte dintr-o expresie.

[[ $# -ne 1 ]]

Ea are, de asemenea, unele alte caracteristici, cum ar fi necotate starea de grupare, de model de potrivire (extended model de potrivire cu extglob`) și regex potrivire.

Următorul exemplu verifică dacă argumentele sunt valabile. Acesta permite un singur argument sau două.

[[ ($# -eq 1 || ($# -eq 2 && $2 == )) && $1 =~  ]]

Pentru pure expresii aritmetice, folosind (( )) pentru unii ar putea fi mai bine, dar acestea sunt încă posibile în[[ ]]cu operatori aritmetici ca-eq,-ne,-a,-le,-gt " sau " - ge` prin plasarea exprimare ca un singur șir argument:

A=1
[[ 'A + 1' -eq 2 ]] && echo true  ## Prints true.

Care ar trebui să fie de ajutor dacă ai nevoie să-l combine cu alte caracteristici ale [[ ]] la fel de bine.

Ieșirea din script

L's, de asemenea, logic pentru a face script-ul de ieșire atunci când invalid parametri sunt transmise la aceasta. Acest lucru a fost deja sugerat în comments de ekangas dar cineva a editat acest răspuns să-l aibă cu -1 ca valoarea returnată, așa că am putea la fel de bine o fac bine.

-1, deși acceptate de Bash ca un argument la "ieșire" nu este documentată în mod explicit și nu este potrivit pentru a fi folosit ca o sugestie comună. 64 este, de asemenea, cele mai formale valoare de l's definit în sysexits.h " cu " #define EX_USAGE 64 /* în linia de comandă unitate procesor eroarea de utilizare */. Cele mai multe instrumente, cum ar fi "ls", de asemenea, a reveni 2 pe argumente nevalide. Am, de asemenea, folosit pentru a reveni 2 în scripturi, dar în ultima vreme nu mai păsat cu adevărat, și pur și simplu folosit 1 în toate erorile. Dar las's doar locul 2 pentru că aici, deoarece's cele mai comune și, probabil, nu sistemul de OPERARE specifice.

if [[ $# -ne 1 ]]; then
    echo "Illegal number of parameters"
    exit 2
fi

Bibliografie

Comentarii (2)

Ar putea fi o idee bună să utilizați expresii aritmetice daca're de-a face cu numere.

if (( $# != 1 )); then
    echo "Illegal number of parameters"
fi
Comentarii (0)

Pe []: !=, =, == ... sunt string operatori de comparație și -eq, -gt ... sunt aritmetică cele binare.

Mi-ar folosi:

if [ "$#" != "1" ]; then

Sau:

if [ $# -eq 1 ]; then
Comentarii (3)

Daca're interesat doar de salvarea dacă un anumit argument lipsește, Parametru de Substituție este mare:

#!/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
Comentarii (4)

Un simplu o linie care funcționează se poate face folosind:

[ "$#" -ne 1 ] && ( usage && exit 1 ) || main

Acest lucru se descompune la:

  1. test bash variabilă pentru dimensiunea de parametri $# nu este egal cu 1 (numărul nostru de sub comenzi)
  2. dacă este true atunci se suna de utilizare (funcția) și de ieșire cu starea 1
  3. altceva apel main() funcția

Se gândește să rețineți:

  • utilizare() poate fi simplu ecou "$0: params"
  • principal poate fi o lungă perioadă de script
Comentarii (3)

Check out acest bash cheatsheet, poate ajuta foarte mult.

Pentru a verifica lungimea de argumente trecut în, puteți folosi"$#"`

Pentru a utiliza serie de argumente trecut în, puteți folosi"$@"`

Un exemplu de verificare lungimea, și iterarea ar fi: `` myFunc() { dacă [[ "$#" -gt 0 ]]; apoi pentru arg în "$@"; face echo $arg făcut fi }

myFunc "$@" ``

Acest articled m-a ajutat, dar a fost lipsă câteva lucruri pentru mine și situația mea. Sperăm că acest lucru vă ajută cineva.

Comentarii (0)

În cazul în care doriți pentru a fi pe partea în condiții de siguranță, vă recomandăm să utilizați getopts.

Aici este un mic exemplu:

    while getopts "x:c" opt; do
      case $opt in
        c)
          echo "-$opt was triggered, deploy to ci account" >&2
          DEPLOY_CI_ACCT="true"
          ;;
            x)
              echo "-$opt was triggered, Parameter: $OPTARG" >&2 
              CMD_TO_EXEC=${OPTARG}
              ;;
            \?)
              echo "Invalid option: -$OPTARG" >&2 
              Usage
              exit 1
              ;;
            :)
              echo "Option -$OPTARG requires an argument." >&2 
              Usage
              exit 1
              ;;
          esac
        done

vezi mai multe detalii aici, de exemplu http://wiki.bash-hackers.org/howto/getopts_tutorial

Comentarii (0)

Aici un simplu garnituri pentru a verifica dacă un singur parametru este dat altfel de ieșire script-ul:

[ "$#" -ne 1 ] && echo "USAGE $0 <paramETER>" && exit
Comentarii (0)

Tu ar trebui să adăugați spații între condiție de testare:

if [ $# -ne 1 ]; 
    then echo "illegal number of parameters"
fi

Sper că acest lucru ajută.

Comentarii (0)