bash: [: zu viele Argumente?

8

Ich versuche ein Verzeichnis zu erstellen und cdhinein:

In ~ / .bashrc:

function abc() {
  appname=$1
  appdir="$HOME/code/$appname"
  if [ mkdir $appdir -a cd $appdir ]; then
    echo Success
  else
    echo Failed to create and switch directory
  fi
}

Wenn ich bashrc ( . ~/.bashrc) neu lade , wird folgende Fehlermeldung angezeigt :

bash: [: too many arguments
Failed to create and switch directory

Wie behebe ich das? Und was bedeutet [:der Fehler?

Ps. Könnte mich jemand zu einem "nicht kryptischen" Bash-Scripting-Tutorial führen?

Zabba
quelle
Es stimmt etwas in Ihrem Skript nicht, ich denke, Sie können beginnen, indem Sie die richtige Syntax mit if verwenden. if <COMMANDS>; then <COMMANDS>; fi
karthick87
2
Ich weiß nicht, ob es nur ich ist ... aber versuchen Sie es mit Pitfall 6; Ich höre, es bekommt ein paar Leute;) mywiki.wooledge.org/BashPitfalls
Alex Stevens

Antworten:

12

Der Hauptfehler in Ihrem Skript besteht darin, dass der [Befehl, der dem Befehl entspricht test, zum Testen von Bedingungen wie Zeichenfolgenvergleich, Vorhandensein von Dateien usw. verwendet wird.

Um den Exit-Status von Prozessen zu testen, müssen Sie ifohne verwenden [, damit Ihr Skript sein kann

if mkdir "$appdir" && cd "$appdir"; then
  echo "Success"
else
  echo "Failed to create and switch directory"
fi

Dies wird in Bash Pitfalls erklärt: 9. if [grep foo myfile .

Ich schlage vor, Sie gehen den GrayCat Bash Guide durch, um Bash zu verstehen.

Enzotib
quelle
Dieser Leitfaden ist wirklich sehr gut! Danke, sonst würde ich immer noch Manpages entschlüsseln :)
Zabba
Eine andere Möglichkeit besteht darin, zu überprüfen, ob das Verzeichnis vorhanden ist, wenn [-d "$ APPDIR"]; dann cd $ APPDIR fi
s1mmel
-3

Ein Prototyp könnte sein:

  • Erstellen Sie eine Datei auf Ihrem Desktop: touch newDirectory.sh
  • Datei ausführbar machen: chmod +x newDirectory.sh
  • So rufen Sie das Skript von einem Terminal auf dem Desktop aus auf: ./newDirectory.sh anyName

/.

#!/bin/bash
function abc() {
  appname=${1}
  appdir="$HOME/Desktop/$appname"
  if (( mkdir "${appdir}" )) ; then     
    cd "${appdir}"  
    echo "Success" 
  else   
    echo "Failed to create and switch directory" 
  fi
}
abc ${1}

Kleine Empfehlung: Wenn Sie neu sind, legen Sie sich nicht an .bashrc:)

studentz
quelle
2
Entschuldige Nein. Bei dieser Antwort gibt es mehrere Probleme. 1) fehlt a {. 2) es läuft nie mkdir. 3) Sie haben den cdExit-Status nicht getestet . 4) Fügen Sie keine Erweiterungen für Skripte hinzu. Vor allem nicht, .shwenn es nicht einmal ein Sh-Skript ist. 5) Das Einfügen in ein Skript macht den Zweck der Funktion zunichte. mywiki.wooledge.org/BashGuide
geirha
@geirha: meine schuld, das {war da vor meiner bearbeitung.
Enzotib
Antwort: ((mkdir "$ {appdir}")) ist gleich 'mkdir "$ {appdir}" '(siehe die hinteren Häkchen )
studentz
Debuggen Sie das Skript bash -x newDirectory.sh und Sie werden sehen, dass das Skript in das Verzeichnis cd wird. Wenn Sie danach einen anderen Prozess ausführen möchten, ist es ein völlig anderes Pferd.
Studentz
Das Skript wird mit Bash Dash Ash ausgeführt. Sie können die Erweiterung beliebig ändern.
Studentz