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?
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
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 == <glob pattern>)) && $1 =~ <regex pattern> ]]
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.
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
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
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
Un simplu o linie care funcționează se poate face folosind:
[ "$#" -ne 1 ] && ( usage && exit 1 ) || main
Acest lucru se descompune la:
Se gândește să rețineți:
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.
Î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