等待用户输入

等待用户输入

我正在为一个经常需要重复的过程创建一个小功能。

我想要做的是,如果我无参数地调用该函数,它将向我显示分支并允许我将流程转到我输入的分支,如果我使用参数调用它,则直接在此类分支上进行流程

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 1010 秒的超时时间。如果没有输入,脚本将退出。

假设此脚本中还有其他内容,否则您实际上不需要函数调用。保存脚本并执行它,传入一个参数。如果存在,它会将参数转发给函数。

另外,我不熟悉 git,所以如果与 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。这是执行您正在执行的操作的更简洁的方法。
    • 您的这里也有一个语法错误 - 缺少空格。应该是[ "$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
...

相关内容