![Problem beim Ausführen eines Shell-Skripts ohne Verwendung von „sh“ unter macOS Monterey](https://rvso.com/image/1672349/Problem%20beim%20Ausf%C3%BChren%20eines%20Shell-Skripts%20ohne%20Verwendung%20von%20%E2%80%9Esh%E2%80%9C%20unter%20macOS%20Monterey.png)
Ich bin neu im Shell-Scripting und im Allgemeinen in der Verwendung von Terminal. Ich habe kürzlich ein Verzeichnis erstellt, script.sh
das ich verwenden möchte, indem ich einfach seinen Namen ohne den vollständigen Pfad eingebe. Also habe ich den Pfad des Verzeichnisses wie .zprofile
folgt 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 sh
und 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/sh
undnicht zsh. Beim sh
Ausführen liest es Ihr Skript myscript.sh
und 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 zsh
und verwendet dessen Regeln für die Syntax.
Ich sehe zwei Lösungen, um dies zum Laufen zu bringen:
- Ändern Sie die erste Zeile, um stattdessen Bash zu verwenden, so dass es wäre
#!/bin/bash
- 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:
- Variablenzuweisungen dürfen keine Leerzeichen um das folgende enthalten
=
:answer=42
$
wird nur verwendet, umde-Referenzieren einer Variable, nicht zuweisen: nicht tun$answer=42
- 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.