I am new to shell scripting and can’t figure this out. If you are unfamiliar, the command git branch returns something like
* develop
master
, where the asterisk marks the currently checked out branch. When I run the following in the terminal:
git branch | grep "*"
I get:
* develop
as expected.
However, when I run
test=$(git branch | grep "*")
or
test=`git branch | grep "*"`
And then
echo $test
, the result is just a list of files in the directory. How do we make the value of test=”* develop”?
Then the next step (once we get “* develop” into a variable called test), is to get the substring. Would that just be the following?
currentBranch=${test:2}
I was playing around with that substring function and I got “bad substitution” errors a lot and don’t know why.
The * is expanded, what you can do is use sed instead of grep and get the name of the branch immediately:
And a version using git symbolic-ref, as suggested by Noufal Ibrahim
To elaborate on the expansion, (as marco already did,) the expansion happens in the echo, when you do
echo $testwith$testcontaining* masterthen the*is expanded according to the normal expansion rules. To suppress this one would have to quote the variable, as shown by marco:echo "$test". Alternatively, if you get rid of the asterisk before you echo it, all will be fine, e.g.echo ${test:2}will just echomaster. Alternatively you could assign it anew as you already proposed:This will echo
master, like you wanted.