ユーザー入力を待つ

ユーザー入力を待つ

頻繁に繰り返す必要があるプロセス用の小さな関数を作成しています。

私がやりたいのは、関数をパラメータなしで呼び出すと、ブランチが表示され、入力したブランチへのプロセスを作成できるようになり、パラメータ付きで呼び出すと、そのようなブランチで直接プロセスを作成できるようになることです。

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"

10 秒のタイムアウトを指定しますread -t 10。入力がない場合、スクリプトは終了します。

このスクリプトに他のものが含まれていると仮定すると、関数呼び出しは実際には必要ないでしょう。スクリプトを保存し、引数を渡して実行します。引数が存在する場合は、その引数が関数に転送されます。

また、私は 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 ]]) は、 が設定されていないか null の場合に false を返します$1。これは、実行していた操作をより簡潔に行う方法です。
    • あなたのものにも構文エラーがありました - 空白がありません。[ "$1" -eq "" ]
  3. read変数を ing する場合は、branchその内容 ( $branch) ではなく、変数名 ( ) を使用します。
  4. 番号付きパラメータよりも名前付き変数を使用する方が適切です。
    • ただし、引数配列に割り当てる必要がある場合は、次のようにします。set -- arg1 arg2
  5. これは戻り値を直接テストします。

また、本当に徹底的にしたい場合は、引数が多すぎる場合にエラーをスローします。

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

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

関連情報