Soy nuevo en los scripts de shell y, en general, en el uso de Terminal. Recientemente creé un script.sh
archivo que quiero usar simplemente escribiendo su nombre sin la ruta completa. Entonces, escribí la ruta del directorio .zprofile
como:
export "PATH=$PATH:/path/to/scriptdirectory"
y cambió los permisos del archivo con:
% chmod +x script.sh
Si uso el script con:
% sh myscript.sh
todo funciona sin problemas según lo previsto. Pero si trato de omitir sh
y escribo:
% myscript.sh
el script comienza a ejecutar su primera parte, que simplemente lee una variable, pero tan pronto como inserto el valor, aparece la siguiente línea:
/path/to/scriptdirectory/script.sh:11: = not found
Este es el guión:
#!/bin/zsh
echo "Do you want to set or change the backup location? (type y/n)"
read SET_BACKUP
while [ "$SET_BACKUP" != "y" ] && [ "$SET_BACKUP" != "n" ]
do
echo "Please, write y or n:"
read SET_BACKUP
done
if [ "$SET_BACKUP" == "y" ]
then
echo "Write the absolute path of the desired backup location:"
read BACKUP_FOLDER
echo "Starting backup..."
cp -R "/fileslocation" "$BACKUP_FOLDER"
echo "Backup completed."
else
echo "Starting backup..."
cp -R "/fileslocation" "$BACKUP_FOLDER"
echo "Backup completed."
fi
Respuesta1
La diferencia es que estás ejecutando el script con dos intérpretes de shell diferentes.
Cuando usas sh myscript.sh
, estás corriendo /bin/sh
yno zsh. Cuando sh
se ejecuta, lee su script myscript.sh
y usa reglas de shell sh/bash para su sintaxis.
Cuando usas just myscript.sh
, el comando usado para ejecutar el script está determinado por la primera línea: #!/bin/zsh
(también conocido como shebang). Entonces se ejecuta usando zsh
y usa sus reglas de sintaxis.
Veo dos soluciones para que esto funcione:
- cambie la primera línea para usar bash en su lugar, así sería
#!/bin/bash
- lea más sobre cómo funcionan los condicionales en zsh y corrija la línea que está rota (parece que es la línea con
if [ "$SET_BACKUP" == "y" ]
)
Respuesta2
Esta no es realmente una respuesta, más bien una pregunta formateada.
Se me ocurren 3 cosas:
- las asignaciones de variables no deben tener espacios alrededor de
=
:answer=42
$
solo esta acostumbrado aDelaware-referenciar una variable, no asignar: no hacer$answer=42
- cita tus variables:
if [ "$answer" = 42 ]
Este soy yo tratando de leer tu mente. Pon algo de código en tu pregunta.
Además, utilicehttps://shellcheck.netpara validar su código shell.