Tengo un problema que se resuelve con esta respuesta.https://superuser.com/a/508761
Ahora necesito ampliarlo para hacer otras cosas, pero primero necesito entender mejor cómo funciona antes de modificarlo. Aquí está el guión en cuestión:
#!/bin/bash
(( $# != 2 )) && exit 1
for f in *; do
newf="${f//$1/$2}"
if [[ $f != $newf ]]; then
mv "$f" "$newf"
fi
done
¿Que es lo que (( $# != 2 )) && exit 1
hace? Tuve poca suerte para encontrar explicaciones en línea: descubrí qué es cada componente pero no qué hace la línea completa en el script en su conjunto. La respuesta no explicaba esa línea. El póster estuvo en línea por última vez hace más de 2 años y no quería responder a una pregunta de hace 5 años, así que aquí estoy.
Respuesta1
Es un operador de control.
Dehombre bash:
Los operadores de control && y || denotan listas Y y listas O, respectivamente. Una lista AND tiene la formaAoperador de controles
comando1 && comando2
comando2 se ejecuta si, y sólo si, comando1 devuelve un estado de salida de cero. [..cortar..] El estado de retorno de las listas AND y OR es el estado de salida del último comando ejecutado en la lista.
Un token que realiza una función de control. Es uno de los siguientes símbolos: || &&&; ;; ( ) |
Entonces, en este caso, no lo lea &&
como un operador booleano. Ahora ya sabe cuándo exit 1
se ejecuta, solo si el comando anterior se ejecuta correctamente (si el estado de salida era cero).
Mira estorespuesta de error del servidorparaexplicación de &&
en 3 contextos diferentes en Bash.Útil para aprender distinciones entre ellos.
Respuesta2
Sale del script en esa línea si no se pasaron exactamente dos argumentos al script.
$#
es el número de argumentos pasados al llamar al script, análogo aargc
en C(( $# != 2 ))
devuelve con un código verdadero (0
) si el número de argumentos no es igual a2
&&
ejecuta el lado derecho solo si el lado izquierdo salió con un código verdadero. Lo que significa que se ejecuta el lado derecho si el número de argumentos no es 2.exit 1
sale del script con el código de salida falso de1
. Esto cancela el script en este punto e informa a la persona que llama que hubo un error.