Problema al ejecutar un script de shell sin usar 'sh' en macOS Monterey

Problema al ejecutar un script de shell sin usar 'sh' en macOS Monterey

Soy nuevo en los scripts de shell y, en general, en el uso de Terminal. Recientemente creé un script.sharchivo que quiero usar simplemente escribiendo su nombre sin la ruta completa. Entonces, escribí la ruta del directorio .zprofilecomo:

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 shy 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/shyno zsh. Cuando shse ejecuta, lee su script myscript.shy 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 zshy usa sus reglas de sintaxis.

Veo dos soluciones para que esto funcione:

  1. cambie la primera línea para usar bash en su lugar, así sería#!/bin/bash
  2. 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:

  1. las asignaciones de variables no deben tener espacios alrededor de =:answer=42
  2. $solo esta acostumbrado aDelaware-referenciar una variable, no asignar: no hacer$answer=42
  3. 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.

información relacionada