Ожидание ввода данных пользователем.

Ожидание ввода данных пользователем.

Я создаю небольшую функцию для процесса, который мне приходится часто повторять.

Я хотел бы, чтобы если я вызову функцию без параметров, она показала мне ветви и позволила мне выполнить процесс на ветке, которую я ввел, а если я вызову ее с параметром, то она позволит выполнить процесс на этой ветке напрямую.

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
}
  1. Это объявляет переменную branchлокальной для функции. Это не обязательно, но это хорошая привычка.
  2. Этот тест ( [[ $1 ]]) вернет false, если $1не установлен или равен null. Это более лаконичный способ сделать то, что вы делали.
    • У вас здесь также была синтаксическая ошибка - пропущенные пробелы. Должно быть[ "$1" -eq "" ]
  3. При readуказании переменной вы используете имя переменной ( branch), а не ее содержимое ( $branch).
  4. Лучше использовать именованную переменную, чем нумерованный параметр.
    • Хотя, если вам действительно нужно присвоить значение массиву аргументов, вы можете использоватьset -- arg1 arg2
  5. Это позволяет напрямую проверить возвращаемое значение.

Также, если вы хотите быть действительно тщательными, выдавайте ошибку, если указано слишком много аргументов:

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

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

Связанный контент