Я создаю небольшую функцию для процесса, который мне приходится часто повторять.
Я хотел бы, чтобы если я вызову функцию без параметров, она показала мне ветви и позволила мне выполнить процесс на ветке, которую я ввел, а если я вызову ее с параметром, то она позволит выполнить процесс на этой ветке напрямую.
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
}
Мой вопрос в том, как я могу задать $1
входное значение, а также выйти, если в части ожидания ввода ничего не задано.
решение1
#!/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"
Задает read -t 10
тайм-аут в 10 секунд. Если входные данные не предоставлены, скрипт завершает работу.
Предполагая, что в этом скрипте есть и другие вещи, иначе вам не нужен был бы вызов функции. Сохраните скрипт и выполните его, передав аргумент. Он перешлет аргумент в функцию, если он есть.
Кроме того, я не знаком с git, так что если что-то из того, что он написал, застряло не в том месте, ну, моя вина.
решение2
Вот как бы я это записал (со сносками):
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
}
- Это объявляет переменную
branch
локальной для функции. Это не обязательно, но это хорошая привычка. - Этот тест (
[[ $1 ]]
) вернет false, если$1
не установлен или равен null. Это более лаконичный способ сделать то, что вы делали.- У вас здесь также была синтаксическая ошибка - пропущенные пробелы. Должно быть
[ "$1" -eq "" ]
- У вас здесь также была синтаксическая ошибка - пропущенные пробелы. Должно быть
- При
read
указании переменной вы используете имя переменной (branch
), а не ее содержимое ($branch
). - Лучше использовать именованную переменную, чем нумерованный параметр.
- Хотя, если вам действительно нужно присвоить значение массиву аргументов, вы можете использовать
set -- arg1 arg2
- Хотя, если вам действительно нужно присвоить значение массиву аргументов, вы можете использовать
- Это позволяет напрямую проверить возвращаемое значение.
Также, если вы хотите быть действительно тщательными, выдавайте ошибку, если указано слишком много аргументов:
if [[ $# -gt 1 ]]; then
echo "${FUNCNAME[0]}: Too many arguments" >&2
return 1
fi
if [[ $1 ]]; then
...