bash: [: muitos argumentos?

8

Estou tentando criar um diretório e cdnele:

Em ~ / .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 recarrego o bashrc ( . ~/.bashrc), recebo o erro:

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

Como faço para corrigir isso? E o que significa [:o erro?

Ps. Alguém poderia me direcionar para um tutorial de script bash "não enigmático"?

Zabba
fonte
Acho que há algo errado no seu script, você pode começar usando a sintaxe apropriada com if. if <COMMANDS>; then <COMMANDS>; fi
Karthick87 2/11
2
Não sei se sou só eu ... mas tente o Pitfall 6; Eu ouço ele recebe algumas pessoas;) mywiki.wooledge.org/BashPitfalls
Alex Stevens

Respostas:

12

O principal erro no seu script é que o [comando, equivalente ao testcomando, é usado para testar condições, como comparação de cadeias, existência de arquivos e assim por diante.

Para testar o status de saída dos processos que você precisa usar ifsem [, para que seu script possa ser

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

Isso é explicado no Bash Pitfalls: 9. if [grep foo myfile .

Sugiro que você leia o GrayCat Bash Guide para entender o bash.

enzotib
fonte
Esse guia é realmente muito bom! Obrigado, caso contrário, eu ainda estaria decifrar páginas man :)
Zabba
Outra maneira é verificar se o diretório existe se [-d "$ APPDIR"]; então cd $ APPDIR fi
s1mmel
-3

Um protótipo pode ser:

  • Crie um arquivo na sua área de trabalho: touch newDirectory.sh
  • Tornar o arquivo executável: chmod +x newDirectory.sh
  • Para chamar o script de um terminal na área de trabalho: ./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}

Pouca recomendação: se você é novo, não mexa com .bashrc:)

studentz
fonte
2
Desculpe, não. Existem vários problemas com essa resposta. 1) faltando a {. 2) nunca é executado mkdir. 3) você não testou cdo status de saída. 4) Não coloque extensões nos scripts. Especialmente .shquando não é nem um sh-script. 5) Colocá-lo em um script anula o objetivo da função. mywiki.wooledge.org/BashGuide
geirha
@geirha: culpa minha, o {estava lá antes da minha edição.
Enzotib
Resposta: ((mkdir "$ {appdir}")) é igual 'mkdir "$ {appdir}" '(olhar na parte de trás carrapatos)
studentz
depure o script bash -x newDirectory.sh e você verá que o script fará o cd no diretório Se você deseja executar outro processo depois disso, é um cavalo completamente diferente.
Student2
O script é executado com bash dash ash. Você pode alterar a extensão conforme desejar.
Student2