bash: [: troppi argomenti?


8

Sto cercando di creare una directory e cdin essa:

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
}

Quando ricarico bashrc ( . ~/.bashrc) ottengo l'errore:

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

Come posso risolvere questo problema? E cosa significa [:nell'errore?

Ps. Qualcuno potrebbe indirizzarmi a un tutorial di scripting bash "non criptico"?


C'è qualcosa di sbagliato nel tuo script, immagino, puoi iniziare usando la sintassi corretta con if. if <COMMANDS>; then <COMMANDS>; fi
karthick87,

2
Non so se sono solo io ... ma prova Pitfall 6; Ho sentito che ci sono alcune persone;) mywiki.wooledge.org/BashPitfalls
Alex Stevens,

Risposte:


12

L'errore principale nello script è che il [comando, equivalente al testcomando, viene utilizzato per testare condizioni, come il confronto delle stringhe, l'esistenza di file e così via.

Per testare lo stato di uscita dei processi che è necessario utilizzare ifsenza [, quindi lo script potrebbe essere

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

Questo è spiegato in Bash Pitfalls: 9. if [grep foo myfile .

Ti suggerisco di consultare la Guida di GrayCat Bash per capire bash.


Quella guida è davvero molto buona! Grazie, altrimenti decifrerei ancora le pagine man :)
Zabba

Un altro modo è verificare se la directory esiste se [-d "$ APPDIR"]; poi cd $ APPDIR fi
s1mmel

-3

Un prototipo potrebbe essere:

  • Crea un file sul desktop: touch newDirectory.sh
  • Rendi eseguibile il file: chmod +x newDirectory.sh
  • Per chiamare lo script da un terminale sul desktop: ./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}

Piccola raccomandazione: se sei nuovo, non scherzare con .bashrc:)


2
Scusa no. Esistono diversi problemi con questa risposta. 1) mancante a {. 2) non funziona mai mkdir. 3) non hai testato lo cdstato di uscita. 4) Non inserire estensioni negli script. Soprattutto .shquando non è nemmeno uno sh-script. 5) Metterlo in uno script sconfigge lo scopo della funzione. mywiki.wooledge.org/BashGuide
geirha

@geirha: colpa mia, {ero lì prima della mia modifica.
enzotib,

Risposta: ((mkdir "$ {appdir}")) è uguale a 'mkdir "$ {appdir}" '(guarda le zecche posteriori)
studentz,

esegui il debug dello script bash -x newDirectory.sh e vedrai che lo script eseguirà il cd nella directory. Se vuoi eseguire un altro processo dopo, è un cavallo completamente diverso.
studentz,

Lo script viene eseguito con un trattino bash. È possibile modificare l'estensione come desiderato.
studentz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.