bash: [: trop d'arguments?

8

J'essaye de créer un répertoire et cddedans:

Dans ~ / .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
}

Lorsque je recharge bashrc ( . ~/.bashrc), j'obtiens l'erreur:

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

Comment puis-je réparer ça? Et que signifie [:l'erreur?

Ps. Quelqu'un pourrait-il me diriger vers un didacticiel de script bash «non cryptique»?

Zabba
la source
Il y a quelque chose qui ne va pas dans votre script, je suppose, vous pouvez commencer par utiliser la syntaxe appropriée avec if. if <COMMANDS>; then <COMMANDS>; fi
karthick87
2
Je ne sais pas si c'est juste moi ... mais essayez Pitfall 6; J'entends qu'il obtient quelques personnes;) mywiki.wooledge.org/BashPitfalls
Alex Stevens

Réponses:

12

L'erreur principale de votre script est que la [commande, équivalente à la testcommande, est utilisée pour tester des conditions, comme la comparaison de chaînes, l'existence de fichiers, etc.

Pour tester l'état de sortie des processus dont vous devez vous ifpasser [, afin que votre script puisse être

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

Ceci est expliqué dans Bash Pitfalls: 9. if [grep foo myfile .

Je vous suggère de parcourir le GrayBat Bash Guide pour comprendre bash.

enzotib
la source
Ce guide est vraiment très bon! Merci, sinon je décrypterais encore les pages de manuel :)
Zabba
Une autre façon consiste à vérifier si le répertoire existe si [-d "$ APPDIR"]; puis cd $ APPDIR fi
s1mmel
-3

Un prototype pourrait être:

  • Créez un fichier sur votre bureau: touch newDirectory.sh
  • Rendre le fichier exécutable: chmod +x newDirectory.sh
  • Pour appeler le script depuis un terminal du bureau: ./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}

Petite recommandation: si vous êtes nouveau, ne plaisante pas .bashrc:)

studentz
la source
2
Non désolé. Il y a plusieurs problèmes avec cette réponse. 1) manquant a {. 2) il ne fonctionne jamais mkdir. 3) vous n'avez pas testé cdl'état de sortie de. 4) Ne mettez pas d'extensions sur les scripts. Surtout pas .shquand ce n'est même pas un sh-script. 5) Le mettre dans un script va à l'encontre du but de la fonction. mywiki.wooledge.org/BashGuide
geirha
@geirha: ma faute, {c'était avant ma retouche.
enzotib
Réponse: ((mkdir "$ {appdir}")) est égal à 'mkdir "$ {appdir}" '(regardez les tiques arrière)
studentz
déboguez le script bash -x newDirectory.sh et vous verrez que le script se placera dans le répertoire. Si vous voulez exécuter un autre processus après cela, c'est un cheval complètement différent.
studentz
Le script s'exécute avec bash dash ash. Vous pouvez modifier l'extension comme vous le souhaitez.
studentz