Das Bash-Skript wird nicht wie erwartet ausgedruckt. Was ist mit meinem Skript nicht in Ordnung?

Das Bash-Skript wird nicht wie erwartet ausgedruckt. Was ist mit meinem Skript nicht in Ordnung?

Ich versuche, ein BASH-Skript zu erstellen, das Argumente liest, testet, ob es sich um ein Verzeichnis, normale, ausführbare oder symbolische Linkdateien handelt, und sie im Terminal ausdruckt.

Wenn ich mein Skript ausführe, verwende ich "./myscript.bash *", um zu sehen, was passiert, aber ich erhalte keine vorhergesagten Ergebnisse. Ich erhalte nur die Namen aller Elemente in meinem Home-Verzeichnis, die "nicht gefunden" sind. Beispiel:

„Desktop nicht gefunden“, „Downloads nicht gefunden“ usw., AUCH wenn sie da sind, in meinem Home-Ordner und Verzeichnisse sind. Weiß jemand, was ich falsch mache?

#!/bin/bash

for i in $*; do
    if [ -d “{$i}” ]; then
        echo “${i} (Directory)”;
    elif [ -x “{$i}” ]; then
        echo “${i} (Executable)”;
    elif [ -h “{$i}” ]; then
        echo “${i} (Symbolic)”;
    elif [ -f “{$i}” ]; then
        echo “${i} (Ordinary)”;
    else
        echo “${i} not found”
    fi

done

Antwort1

Erste Regel zum Debuggen einfacher Skripte:

Wenn es nicht funktioniert, versuchen Sie es mit Echo.

In diesem Fall:

for i in $*; do
    echo  "testing if “{$i}” exists"
    if [ -d “{$i}” ]; then
        echo “${i} (Directory)”;
<... rest of the script ...>

Sie werden sofort sehen, dass die Antwort lautet:

testing if “{Downloads}” exists
...

Das heißt: Es wird geprüft, ob „{Downloads}“ (smartquotes-accolade open-Downloads-accolade close smartquotes) vorhanden ist.

Dieses Verzeichnis existiert wahrscheinlich nicht.

Die Smartquotes können für einen Shell-Scripting-Anfänger ein Versehen sein. Bash (und die meisten anderen Shells auch) sind sehr wählerisch, was die Verwendung von Anführungszeichen angeht. Ein einfaches Anführungszeichen ( ') hat eine andere Bedeutung als ein doppeltes Anführungszeichen ( "). Back-Quotes haben ebenfalls eine andere Bedeutung. Smartquotes sind die, die dir deine Mutter gegeben hat. Tu überhaupt nichts (wenn du mir meine Anspielung auf Jefferson Airplane verzeihst). Die doppelten Anführungszeichen ( ) brauchst du hier auf jeden Fall ", weil sie eine Variablenerweiterung ermöglichen.

Als nächstes kommen die {und }. In Ihren echogeben Sie an:

echo “${i} not found”

aber in der ifist es {$i}. Finde den Unterschied. Wenn Sie verwendet haben

if [ -d "${i}" ]; then

es hätte funktioniert.

Kamil schrieb in seinen Kommentaren:

Sie wollen fast nie $*; stattdessen wollen Sie fast immer "$@".

und er hat recht. Es gibt ganze Seiten, die sich mit dem Unterschied zwischen $*und befassen "$@", aber der einfachste Weg, den Unterschied zu zeigen, ist wie folgt:

#!/bin/bash
echo ------------------
echo '$*'
for i in $* ; do echo $i ; done
echo ------------------
echo '"$@"'
for i in "$@" ; do echo $i ; done
echo ------------------

(Ich habe dieses Skript aufgerufen a) und mit folgendem ausführen:

bash a 'plop 123' plop 123
------------------
$*
plop
123
plop
123
------------------
"$@"
plop 123
plop
123
------------------

Antwort2

@ljm hat den Nagel auf den Kopf getroffen. Das Einzige, was ich noch ergänzend sagen möchte, ist, immer das gewünschte Ergebnis wiederzugeben und eine bessere Funktionalität darum herum aufzubauen.

Kurz gesagt: Erst sicherstellen, dass es funktioniert, dann dafür sorgen, dass es besser funktioniert

verwandte Informationen