bash: [: demasiados argumentos?

8

Estoy tratando de crear un directorio y cden él:

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

Cuando vuelvo a cargar bashrc ( . ~/.bashrc) me sale el error:

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

¿Cómo puedo solucionar esto? ¿Y qué significa [:en el error?

PD. ¿Alguien podría dirigirme a un tutorial de script de bash "no críptico"?

Zabba
fuente
Supongo que hay algo mal en tu script, puedes comenzar usando la sintaxis adecuada con if. if <COMMANDS>; then <COMMANDS>; fi
karthick87
2
No sé si soy solo yo ... pero prueba Pitfall 6; Escuché que recibe algunas personas;) mywiki.wooledge.org/BashPitfalls
Alex Stevens

Respuestas:

12

El principal error en su script es que el [comando, equivalente al testcomando, se usa para probar condiciones, como la comparación de cadenas, la existencia de archivos, etc.

Para probar el estado de salida de los procesos que tiene que usar ifsin ellos [, entonces su script podría ser

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

Esto se explica en Bash Pitfalls: 9. if [grep foo myfile .

Le sugiero que consulte la Guía de GrayCat Bash para comprender bash.

enzotib
fuente
¡Esa guía es realmente muy buena! Gracias, de lo contrario todavía estaría descifrando páginas de manual :)
Zabba
Otra forma es verificar si el directorio existe si [-d "$ APPDIR"]; luego cd $ APPDIR fi
s1mmel
-3

Un prototipo podría ser:

  • Crea un archivo en tu escritorio: touch newDirectory.sh
  • Hacer el archivo ejecutable: chmod +x newDirectory.sh
  • Para llamar al script desde una terminal en el escritorio: ./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}

Pequeña recomendación: si eres nuevo, no te metas con .bashrc:)

studentz
fuente
2
Lo siento, no. Hay varios problemas con esa respuesta. 1) falta a {. 2) nunca se ejecuta mkdir. 3) no cdprobaste el estado de salida. 4) No pongas extensiones en los scripts. Especialmente no .shcuando ni siquiera es un sh-script. 5) Ponerlo en un script anula el propósito de la función. mywiki.wooledge.org/BashGuide
geirha
@geirha: mi culpa, {estaba allí antes de mi edición.
enzotib
Respuesta: ((mkdir "$ {appdir}")) es igual 'mkdir "$ {appdir}" '(mira los ticks posteriores)
studentz
depure el script bash -x newDirectory.sh y verá que el script se cd en el directorio. Si desea ejecutar otro proceso después de eso, es un caballo completamente diferente.
studentz
El script se ejecuta con bash dash ash. Puedes cambiar la extensión como quieras.
studentz