Problem beim Ausführen eines Shell-Skripts ohne Verwendung von „sh“ unter macOS Monterey

Problem beim Ausführen eines Shell-Skripts ohne Verwendung von „sh“ unter macOS Monterey

Ich bin neu im Shell-Scripting und im Allgemeinen in der Verwendung von Terminal. Ich habe kürzlich ein Verzeichnis erstellt, script.shdas ich verwenden möchte, indem ich einfach seinen Namen ohne den vollständigen Pfad eingebe. Also habe ich den Pfad des Verzeichnisses wie .zprofilefolgt geschrieben:

export "PATH=$PATH:/path/to/scriptdirectory"

und habe die Dateiberechtigungen geändert mit:

% chmod +x script.sh

Wenn ich das Skript verwende mit:

% sh myscript.sh

alles läuft wie vorgesehen reibungslos. Aber wenn ich versuche, das shund wegzulassen, tippe ich:

% myscript.sh

Das Skript beginnt mit der Ausführung seines ersten Teils, bei dem nur eine Variable gelesen wird. Sobald ich jedoch den Wert eingebe, erscheint die folgende Zeile:

/path/to/scriptdirectory/script.sh:11: = not found

Dies ist das Skript:

#!/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

Antwort1

Der Unterschied besteht darin, dass Sie das Skript mit zwei verschiedenen Shell-Interpretern ausführen.

Wenn Sie verwenden sh myscript.sh, laufen Sie /bin/shundnicht zsh. Beim shAusführen liest es Ihr Skript myscript.shund verwendet Sh/Bash-Shell-Regeln für seine Syntax.

Wenn Sie nur verwenden myscript.sh, wird der zum Ausführen des Skripts verwendete Befehl durch die erste Zeile bestimmt: #!/bin/zsh(auch als Shebang bekannt). Es wird also mit ausgeführt zshund verwendet dessen Regeln für die Syntax.

Ich sehe zwei Lösungen, um dies zum Laufen zu bringen:

  1. Ändern Sie die erste Zeile, um stattdessen Bash zu verwenden, so dass es wäre#!/bin/bash
  2. Lesen Sie mehr darüber, wie Bedingungen in zsh funktionieren und reparieren Sie die Zeile, die defekt ist (es sieht aus, als wäre es die Zeile mit if [ "$SET_BACKUP" == "y" ]).

Antwort2

Dies ist keine richtige Antwort, sondern eher eine formatierte Frage.

Mir fallen 3 Dinge ein:

  1. Variablenzuweisungen dürfen keine Leerzeichen um das folgende enthalten =:answer=42
  2. $wird nur verwendet, umde-Referenzieren einer Variable, nicht zuweisen: nicht tun$answer=42
  3. zitieren Sie Ihre Variablen:if [ "$answer" = 42 ]

Ich versuche, Ihre Gedanken zu lesen. Fügen Sie Ihrer Frage einen Code ein.

Auch verwendenhttps://shellcheck.netum Ihren Shell-Code zu validieren.

verwandte Informationen