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?


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.


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:)


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.