La primera cosa obvia es que debe proporcionar espacios entre los argumentos de [
, test
o [[
:
if [ "$1" = 1 ];
Cuando está en Bash, [[ ]]
se recomienda el uso, ya que no hace cosas innecesarias para la expresión condicional, como la división de palabras y la expansión de nombres de ruta. Citar alrededor de comillas dobles tampoco es necesario. ==
También se puede utilizar un operador más legible .
if [[ $1 == 1 ]];
Se agregó una nota: Si segundo operando también contiene variables, citando es necesario, ya que puede estar sujeta a la coincidencia de patrones si contiene caracteres reconocibles como *
, ?
, []
, etc .. Si englobamiento extendido o coincidencia de patrones está habilitado con shopt -s extglob
, otras formas como @()
, !()
, etc. También será reconocido como patrones. Ver coincidencia de patrones .
Con operadores similares <
y >
todavía puede ser necesario, ya que una vez me encontré con un error en el que no citar el segundo argumento causaba resultados diferentes.
En cuanto al primer operando, no se aplica nada.
Considere también esta variación más simple:
case "$1" in
1)
mv -- "${@:2}" ~/lab/Sun
;;
2)
mv -- "${@:2}" ~/lab/Moon
;;
3)
mv -- "${@:2}" ~/lab/Earth
;;
esac
O condensado:
case "$1" in
1) mv -- "${@:2}" ~/lab/Sun ;;
2) mv -- "${@:2}" ~/lab/Moon ;;
3) mv -- "${@:2}" ~/lab/Earth ;;
esac
"${@:2}"
es una forma de expansión de subcadena o expansión de miembro de matriz donde 2
está el desplazamiento. Esto hace que la expansión comience en el segundo valor. Con esto puede que no necesitemos usar shift
.
El agregado --
impide mv
reconocer nombres de archivo que comienzan con guión ( -
) como opciones no válidas.
$var
,$(cmd)
e incluso`cmd`
[a la que$(cmd)
se debe preferir]). Hay algunos casos extremos en los que no tiene que citar, pero hacerlo siempre no le hará daño.