Espere la entrada del usuario

Espere la entrada del usuario

Estoy creando una pequeña función para un proceso que tengo que repetir con frecuencia.

Lo que me gustaría hacer es que si llamo a la función sin parámetros, me muestre las ramas y me permita hacer el proceso a la rama que ingresé, y si la llamo con un parámetro para hacer el proceso en dicha rama directamente

function 3bra(){
  #If there's no parameter
  if ["$1" -eq ""]; then
    #show me the branches
    git branch
    #wait for input and give the parameter such entered value
    read $1
  fi

  #checkout to the parameter branch
  git checkout "$1"

  if [ $? -eq 0 ]; then
    #if there are no errors, complete the checkout process
    npm i
    npm rebuild node-sass --force
    npm run start
  fi
}

Mi pregunta es ¿cómo puedo dar $1el valor de entrada y también salir si no se proporciona nada en la parte de espera de entrada?

Respuesta1

#!/bin/bash
branch=""
function 3bra(){
  #If there's no paramether
  if [[ -z "$*" ]]; then
    #show me the branches
    git branch
    #wait for input and give the paramether such entered value
    echo "Which branch?"
    read -t 10 branch || exit
  else
    #Stuff to do if 3bra is called with params...
    branch="$1"
  fi
  #checkout to the paramether branch
  git checkout "$branch"
  if [[ "$?" -eq 0 ]]; then
    #if there are no errors, complete the checkout process
    npm i
    npm rebuild node-sass --force
    npm run start
  fi
}
#Call the function and pass in the parameters.
3bra "$1"

El read -t 10especifica un tiempo de espera de 10 segundos. Si no se proporciona ninguna entrada, el script se cierra.

Suponiendo que haya otras cosas en este script, de lo contrario no necesitarías la llamada a la función. Guarde el script y ejecútelo, pasando un argumento. Reenviará el argumento a la función, si está presente.

Además, no estoy familiarizado con git, por lo que si algo relacionado con git está atascado en el lugar equivocado, es una lástima.

Respuesta2

Así es como lo escribiría (con notas a pie de página):

function 3bra(){
  local branch  # (1)

  if [[ $1 ]]; then  # (2)
    branch="$1"
  else
    # Show branches.
    git branch
    # Get branch from user.
    read branch  # (3, 4)
  fi

  # Checkout the given branch.
  if git checkout "$branch"; then  # (5)
    # Complete the checkout process.
    npm i
    npm rebuild node-sass --force
    npm run start
  fi
}
  1. Esto declara la variable branchlocal a la función. Esto no es obligatorio, pero es un buen hábito.
  2. Esta prueba ( [[ $1 ]]) devolverá falso si $1no está configurada o es nula. Es una forma más sucinta de hacer lo que estabas haciendo.
    • El tuyo también tenía un error de sintaxis aquí: faltaban espacios en blanco. Debiera ser[ "$1" -eq "" ]
  3. Al readingresar una variable, se utiliza el nombre de la variable ( branch), no su contenido ( $branch).
  4. Es mejor utilizar una variable con nombre que un parámetro numerado.
    • Aunque si necesita asignar a la matriz de argumentos, puede usarset -- arg1 arg2
  5. Esto prueba el valor de retorno directamente.

Además, si quieres ser realmente exhaustivo, arroja un error si se proporcionan demasiados argumentos:

if [[ $# -gt 1 ]]; then
  echo "${FUNCNAME[0]}: Too many arguments" >&2
  return 1
fi

if [[ $1 ]]; then
...

información relacionada