Shell scripts are awesome
Tags: bash, webdev, programming
Published: 2019-11-13 21:06:40

---
title: Shell scripts are awesome
published: true
description: A quick shoutout about Shell scripts
tags: bash, webdev, discuss, programming
---

(big thanks for [Ben Sinclair's](https://dev.to/moopet) comment to help correct some things.)

I love using command line, it something about it's simplicity and power.


I just wanted to give a quick idea out there, to help speed up your day. I also hope you'll add any of your fun and helpful tools! 

So here are my favs.

Aliases are super useful and I have a bunch. If you want them, message me. If i get enough response I'll make a post about it. But this is more focussed on functions and module combination to do some neat stuff.

First off, this post started because just now i was like "why am i retyping this every time!" and I wrote a quick function in 10 seconds, and realized I should share this!

So at work we do git forks, and then we branch per story.

I personally call the origin/master "upstream" and my fork of it by name name. 

Each time I start a new story I have to run the following commands. 

`git fetch upstream`
`git checkout -b STORY_NUMBER_WITH_BRIED_DESC upstream/master`
`git pull upstream master` // repetitive but for some reason fetch doesn't always update for me


So I type that literally every time I start a new story. It's a lot to type especially when you have more than 1 services that will be involved.

So this little function in my ~/.zshrc file (you may be using .bash_profile) make it easier! 

```bash
newStory() {
    git fetch upstream && git checkout -b $1 upstream/master && git pull upstream master;
}
```

to use it, just make sure to source you new changes `source ~/.zshrc` and now I just type 

```bash
newStory B-23168_automated_testing
```

There are many other one off shell script functions I use. I have a hard time remembering how to spell words. So I have a `spl` command which behind the scenes will run the [`aspell` module](https://formulae.brew.sh/formula/aspell). Which you can install via brew. 

```bash
spl () {
    aspell -a <<< "$1"
}
``` 

Now I run my new command and it'll give me back what it thinks I mean. The first 1 or 2 words are almost always the one you meant. 

```bash
spl polymorfus

> & polymorfus 3 0: polymorphous, polymers, polymer's
```


Maybe you wanna create your own function that call a custom script to do more than you know how to do in bash. Maybe PHP is your best language and you suck as bash other than the basics? 

No problem! 

Add your php shell script. Simple as using `#!/path/to/php` and then your php script. You can get your paths by using `which php`

~/.settings/snippets/urldecode (no extension)
```php
#!/usr/bin/php
<?php

echo urldecode($argv[1]);
?>
```

now add your snippets folder export to the end of the `~/.zshrc` file. This will make any script in this folder available to the command line! (thanks Ben for the better solution)

```bash
export PATH=$HOME/.settings/snippets:$PATH
```

and boom💥 you have a new script of your own making! 

```bash
urldecode this%20is%20my%20string%21%20

> this is my string! %
```

So as you can see, you can do a lot with bash. It's awesome! I've dumped a few more below that you might wanna use. If you see it using another function name, you will probably need to brew install or npm install it. 

```bash
# take every file and move it to the current folder
#
# with in parent folder you want, run flattenSubfolders
flattenSubfolders () {
    find . -type f -exec mv -n -- {} . \;
}

# used after you use flattenSubfolders to remove empty subfolders
#
# with in parent folder you want, run removeEmptySubdirs
removeEmptySubdirs () {
    find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;
}

# will open chrome and turn your README.md in to a nice web view, requires https://github.com/joeyespo/grip 
#
# rmd ./README.md
rmd () {
    grip -b $1 &
    TASK_PID=$!
    sleep 10
    kill $TASK_PID
}

# video helpers 
#
# genWebMp4 ./movie.ext ./newmovie.mp4
genWebMp4 () {
    ffmpeg -i $1 -vcodec h264 -acodec aac -strict -2 $2
}

#
# genWebm ./movie.ext ./newmovie.webm
genWebm () {
    ffmpeg -i $1 -c:v libvpx-vp9 -b:v 2M -pass 1 -c:a libopus -f webm /dev/null && \
        ffmpeg -i $1 -c:v libvpx-vp9 -b:v 2M -pass 2 -c:a libopus $2
}

#
# wavToMp3 ./file
wavToMp3() {
    ffmpeg -i $1.wav -codec:a libmp3lame -qscale:a 2 $1.mp3
}

#
# with in folder of all mp3s, run mp3ToOgg
mp3ToOgg() {
    for file in *.mp3
        do ffmpeg -i "${file}" "${file/%mp3/ogg}"
    done
}

#
# genVideoThumb ./video.ext ./thumbnail.ext
# you can use jpg and png for thumbnail ext
genVideoThumb () {
    ffmpeg -ss 00:00:01  -i $1 -vframes 1 -q:v 2 $2
}

#
# spl word
spl () {
    aspell -a <<< "$1"
}

#
# gitCleanBranches
gitCleanBranches() {
    git branch --merged | egrep -v "(^\*|master|develop)" | xargs git branch -d
}
```


Hope you liked it. See an issue? Let me know. 

Please add yours in the comments!


---

Varymade LLC.

Current projects are https://charactergenerator4000.com and https://coder.exchange. Please check them out and let us know your thoughts. 

--DeChamp