bash保持变量的旧值

时间:2018-08-16 20:03:41

标签: bash git github github-hub

我有这个bash脚本,我想复制一个分支,并使用该复制分支对远程仓库进行PR,然后删除该复制分支:

gPullRequest () {
  branch=$(git rev-parse --abbrev-ref HEAD)
  if [ $# -eq 0 ]
    then
      git checkout -b development-$branch
  elif [ $# -eq 1 ]
    then
      git checkout -b release-$branch
  fi
  gp
  prBranch=$(git rev-parse --abbrev-ref HEAD)
  if [ $# -eq 0 ]
    then
      hub pull-request -h org:$prBranch -b org:development
  elif [ $# -eq 1 ]
    then
      hub pull-request -h org:$prBranch -b org:$1
  fi
  git checkout $branch
  git branch -D $prBranch
}

问题在于,到时间branch的变量prBranch被重新评估为git checkout $branch 所指向的内容

branch

此代码运行时,gp () { branch=$(git rev-parse --abbrev-ref HEAD) git push origin $branch } 变量是新的分支名称,而不是代码第一行中的第一个值。

关于如何保留branch的值以便以后执行bash脚本的任何想法?

编辑

15c77f1f6031      Exited (0) 11 seconds ago
340b71ec10c2      Exited (0) 22 seconds ago
7484ada905f6      Exited (0) 33 seconds ago
0aa691d2d3d9      Exited (0) 44 seconds ago

此错误以前没有出现在原始提示中,但这是导致该错误的原因。

1 个答案:

答案 0 :(得分:1)

这肯定意味着您的bp函数开始如下:

bp() {
  branch=$1
  othervar=$(whatever)
  # ...do stuff here...
}

您不能安全地这样做,因为-与Java语言一样-变量默认在bash中是全局的。因此,在调用的函数内设置branch也会更改父项中的值。

始终声明您的本地人,就像这样:

bp() {
  local branch othervar
  branch=$1
  othervar=$(whatever)
  # ...do stuff here...
}

(为什么要用两行分开,而不是local branch=$1?因为当您想移至local foo=$(bar)时,local命令会吃掉{{1}的退出状态},使其以后无法确定其成功或失败;保持将局部声明保留在单独一行的习惯可以避免此问题。