等待用戶輸入

等待用戶輸入

我正在為我經常重複的過程創建一個小函數。

我想做的是,如果我無參數調用該函數,它會向我顯示分支並允許我對我輸入的分支進行處理,如果我使用參數調用它,則可以直接在該分支上進行處理

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. 如果未設定或為 null,則此測試 ( [[ $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
...

相關內容