Si sta commettendo l'errore comune di supporre che [
sia parte della sintassi del comando if
. Non è; la sintassi di if
è semplicemente
if command; then
... things which should happen if command's result code was 0
else
... things which should happen otherwise
fi
Uno dei comuni command
s che usiamo è [
che è un alias per il comando test
. È un semplice comando per confrontare stringhe, numeri e file. Accetta una combinazione piuttosto ristretta di argomenti e tende a generare messaggi di errore confusi e fuorvianti se non si passano gli argomenti previsti. (O meglio, i messaggi di errore sono adeguati e utili una volta che ci si abitua, ma sono facilmente fraintesi se non si è abituati.)
Nella tua funzione main
, la chiamata a [
appare in modo errato. Probabilmente vuoi dire
if function "$arg"; then
...
elif ... ; then ...
A proposito, per buona misura dovresti sempre citare le tue corde. Utilizzare "$1"
non $1
e "$arg"
anziché $arg
.
Le ragioni storiche per test
come un lavandino della cucina in generale di cose gli autori non vogliono fare parte della sintassi di if
è uno dei disegni meno attraenti del guscio originale Bourne. Bash e zsh
offrono alternative meno ingombranti (come le parentesi doppie [[
in bash, che si utilizzano nella definizione function1
) e, naturalmente, POSIX test
è molto più armonioso rispetto alla creazione originale di Bell Labs.
Come ulteriore chiarimento, la funzione può essere semplificata a poco
function1() {
! [[ "$1" =~ "^ ...some regexp... $" ]]
}
Cioè, eseguire il test con [[
e invertire il suo codice risultato. (Il caso "normale" sarebbe quello di restituire 0 per il successo, ma forse stai tentando di verificare che la stringa non corrisponde?)
Nota che, almeno in bash versione 4, non devi citare l'espressione regolare : così facendo forza la semplice corrispondenza delle stringhe - [documentato qui] (http://www.gnu.org/software/bash/manual/bashref.html#index-g_t_005b_005b-57). Inoltre, dovresti usare 'for arg in" $ @ "' con le virgolette, o più semplice 'per arg; do ... ' –
Dovresti mettere la tua regex in una variabile. 'pattern = '^ ... some regexp ... $'; se [[$ 1 = ~ $ pattern]] '. Si noti che all'interno di parentesi quadre quadrate, non è necessario citare le variabili e, come detto glenn, la regex (variabile) non dovrebbe mai essere citata. –