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 $1
el 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 10
especifica 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
}
- Esto declara la variable
branch
local a la función. Esto no es obligatorio, pero es un buen hábito. - Esta prueba (
[[ $1 ]]
) devolverá falso si$1
no 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 "" ]
- El tuyo también tenía un error de sintaxis aquí: faltaban espacios en blanco. Debiera ser
- Al
read
ingresar una variable, se utiliza el nombre de la variable (branch
), no su contenido ($branch
). - Es mejor utilizar una variable con nombre que un parámetro numerado.
- Aunque si necesita asignar a la matriz de argumentos, puede usar
set -- arg1 arg2
- Aunque si necesita asignar a la matriz de argumentos, puede usar
- 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
...