Comete el error común de suponer que [
es parte de la sintaxis del comando if
. No lo es; la sintaxis de if
es simplemente
if command; then
... things which should happen if command's result code was 0
else
... things which should happen otherwise
fi
Uno de los command
s comunes que usamos es [
que es un alias para el comando test
. Es un comando simple para comparar cadenas, números y archivos. Acepta una combinación bastante estrecha de argumentos, y tiende a generar mensajes de error confusos y engañosos si no le pasa los argumentos esperados. (O más bien, los mensajes de error son adecuados y útiles una vez que te acostumbras, pero son fácilmente incomprendidos si no te utilizan)
En tu función main
, la llamada al [
aparece fuera de lugar. Probablemente se refiera a
if function "$arg"; then
...
elif ... ; then ...
Por cierto, para una buena medida, siempre debe citar sus cadenas. Utilice "$1"
no $1
y "$arg"
en lugar de $arg
.
Las razones históricas para test
como un fregadero de la cocina general de cosas que los autores no quisieron hacer parte de la sintaxis de if
es uno de los diseños menos atractivos del shell Bourne original. Bash y zsh
ofrecen alternativas que son menos difíciles de manejar (como los [[
paréntesis dobles en bash, que se usan en su definición function1
), y por supuesto, POSIX test
es mucho más temperamental que la creación original de Bell Labs.
como una aclaración adicional, su función se puede simplificar a solo
function1() {
! [[ "$1" =~ "^ ...some regexp... $" ]]
}
Es decir, realizar la prueba con [[
y revertir su código de resultado. (El caso "normal" sería devolver 0 para tener éxito, pero quizás esté intentando verificar que la cadena no concuerde?)
Tenga en cuenta que, al menos en la versión 4 de bash, no debe citar la expresión regular : hacerlo fuerza una simple coincidencia de cadenas - [documentado aquí] (http://www.gnu.org/software/bash/manual/bashref.html#index-g_t_005b_005b-57). Además, debe usar 'para arg en" $ @ "' con las comillas, o 'para arg; do ... ' –
Deberías poner tu expresión regular en una variable. 'pattern = '^ ... some regexp ... $'; si [[$ 1 = ~ $ patrón]] '. Tenga en cuenta que dentro de los corchetes dobles, no es necesario citar variables y, como dijo glenn, la expresión regular (variable) nunca se debe citar. –