Shell script that copies configuration and dotfiles to repository
This is pretty nicely written. I have a couple of tips to improve it though.

Don't include trailing / in path variables

Although there's absolutely nothing wrong with this:


REPO_PATH="$PWD/"
# ...
OS="osx/"
# ...
BASH_DEST="${REPO_PATH}${OS}bash/"



In my experience, not including the trailing slash is typically more ergonomic, and sometimes even less error-prone:


You might have a function that's expecting the trailing slash, and some callers might forget to append it correctly, and there's no reasonable way to enforce at "compile time".
When I see concatenated path-like variables like $REPO_PATH${OS}bash I'm always suspicious if the caller added the slash or not.
It makes me constantly look over my shoulders and re-check all uses.


Consider this alternative:

REPO_PATH=$PWD
# ...
OS=osx
# ...
BASH_DEST="$REPO_PATH/$OS/bash"


Here, I know that "$REPO_PATH/$OS/bash" will be definitely close to what I expect,
and no need to worry about forgotten slashes anywhere.
I also know it's a path,
which is less obvious in the case of the original.

Don't execute the same thing repeatedly

When you detect the OS,
the script might execute uname 3 times.
It would be better to run it once and save in a variable.

Avoid expr

expr is archaic. Usually there are better solutions.
You could also simplify the OS detection conditions using [[ instead:

uname=$(uname -s)   

# Detect OS (OS X, Linux or Windows)
if [[ $uname = Darwin ]]; then
    echo "Detected system: OS X"
    OS=osx
    ST_DIR="$HOME/Library/Application Support/Sublime Text 3/Packages/User/"
elif [[ $uname == *Linux* ]]; then
    echo "Detected system: Linux"    
    OS=linux
    ST_DIR="$HOME/.config/sublime-text-3/Packages/User/"
elif [[ $uname == *MINGW32_NT* ]]; then
    echo "Detected system: Windows"   
    OS=win
    ST_DIR="$HOME/AppData/Roaming/Sublime Text 3/Packages/User/"
    NPM_DIR="$HOME/AppData/Roaming/npm/node_modules/npm/"
fi


Quote paths that may contain spaces

It's not obvious that these paths will never contain spaces:


declare -a destinations=($BASH_DEST $GIT_DEST $NPM_DEST $RUBY_DEST $ST_DEST)



It's better to be safe, and put double-quotes around each.

More careful error handling

If you couldn't detect the OS, I suggest to print a warning and exit.

Use case for switches

The final OS-specific operations could be written a bit cleaner using a case statement.