Below is a script to create and manage text snippets. It is also posted on GitHub. Most of the code is error checking and displaying help because I wanted to make a solid command line interface. The blanks function is used when copying a snippet with a blank (@) character in it. The user fills in the blanks.
I am looking for a review of the script: Is it easy to use? Is the code confusing? Are there any horrible bugs that I left unnoticed?
It is tested in OS X, so I am not sure if the syntax will work elsewhere. Specifically, the pbcopy and pbpaste aliases are untested.
#!/bin/sh
list() {
    echo "snp snippets:\n"
    echo "$(ls -R $snippets_dir)"
}
move() {
    if [[ "$2" == "" && $3 == "" ]]; then
        echo "snp usage:\n"
        echo "snp move <name> <group>"
    elif [[ -e $snippets_dir/$2 ]]; then
        if -d $snippets_dir/$3 ]]; then
            mv $snippets_dir/$2 $snippets_dir/$3/$2
        else
            echo "ERROR: Group $snippets_dir/$3 does not exist."; exit 1
        fi
    else
        echo "ERROR: Snippet $2 does not exist."; exit 1
    fi
}
new() {
    if [[ "$2" == "" && "$3" == "" ]]; then
        echo "snp usage:\n"
        echo "snp new <name> \"<text>\""
        echo "snp new group <name>"
    elif [[ "$2" == "group" || "$2" == "g" ]]; then # New group
        if [[ "$3" != "" ]]; then
            mkdir $snippets_dir/$3
            echo "Created new group \"$3\"."
        else
            echo "snp usage:\n"
            echo "snp new group <name>"
        fi
    else # New snippet
        if [[ "$2" == "" ]]; then
            echo "snp usage:\n"
            echo "snp new <name> \"<text>\""
        else
            if [[ -e $snippets_dir/$2 ]]; then
                echo "Snippet $snippet_dir/$2 already exists."
                echo "Overwrite? [y/n]"
                read yn
                if [[ $yn == "y" || $yn == "Y" ]]; then
                    rm $snippets_dir/$2
                else
                    return
                fi
            fi
            printf "$3" >> $snippets_dir/$2
            echo "Created new snippet \"$2\"."
        fi
    fi
}
remove() {
    if [[ "$2" == "" ]]; then
        echo "snp usage:\n"
        echo "snp remove <name>"
        echo "snp remove group <name>"
    elif [[ "$2" == "group" || "$2" == "g" ]]; then # Remove group
        if [[ "$3" != "" ]]; then
            if [[ -e "$snippets_dir/$3" ]]; then
                rm -rf $snippets_dir/$3
                echo "Removed group \"$3\"."
            else
                echo "ERROR: Group $3 does not exist."; exit 1
            fi
        else
            echo "snp usage:\n"
            echo "snp remove group <name>"
        fi
    elif [[ "$2" != "" ]]; then # Remove snippet
        if [[ -e $snippets_dir/$2 ]]; then
            rm $snippets_dir/$2
            echo "Removed snippet \"$2\"."
        else
            echo "ERROR: Snippet $2 does not exist."; exit 1
        fi
    fi
}
blanks() {
    data=$(cat $1)
    count=0
    OIFS=$IFS
    IFS="@"
    blanx=$(echo "$data" | tr -d -c '@' | wc -c | awk '{print $1}')
    result=""
    for x in $data; do
        if [ $count -eq $blanx ]; then
            echo "$x"
            result="$result$x"
            break
        fi
        echo "$x"
        result="$result$x"
        read -p"snp> " v
        result="$result$v"
        count=`expr $count + 1`
    done
    IFS=$OIFS
    printf "$result" >> $1-tmp
}
copy() {
    if [[ "$1" == "" ]]; then
        usage
    elif [[ -e $snippets_dir/$1 ]]; then
        if [ ! $(uname -s) = "Darwin" ]; then
            alias pbcopy='xsel --clipboard --input'
        fi
        blanks $snippets_dir/$1
        cat $snippets_dir/$1-tmp | pbcopy
        echo "Snippet text copied to clipboard."
        rm $snippets_dir/$1-tmp
    else
        echo "ERROR: Snippet $1 does not exist."; exit 1
    fi
}
paste() {
    if [[ "$2" == "" ]]; then
        usage
    elif [[ -e $snippets_dir/$2 ]]; then
        if [ ! $(uname -s) = "Darwin" ]; then
            alias pbcopy='xsel --clipboard --input'
            alias pbpaste='xsel --clipboard --output'
        fi
        blanks $snippets_dir/$2
        cat $snippets_dir/$2-tmp | pbcopy
        pbpaste
        rm $snippets_dir/$2-tmp
    else
        echo "ERROR: Snippet $2 does not exist."; exit 1
    fi
}
usage() {
    echo "snp usage:\n"
    echo "snp <name>                # Copy snippet to clipboard"
    echo "snp paste <name>          # Paste name (from clipboard)"
    echo "snp new <name> \"<text>\"   # New snippet"
    echo "snp new group <name>      # New group"
    echo "snp list                  # List snippets"
    echo "snp move <name> <group>   # Move snippet to group"
    echo "snp remove <name>         # Remove snippet"
    echo "snp remove group <name>   # Remove group"
    echo "snp help                  # Display usage"
}
snippets_dir=~/".snp"
# Check for/create snippet dir
if [[ ! -d $snippets_dir ]]; then
    echo "ERROR: $snippets_dir doesn't exist."
    echo "Create it now? [y/n]"
    read yn
    if [[ $yn == "y" || $yn == "Y" ]]; then
        mkdir $snippets_dir
        echo "$snippets_dir created"
    else
        exit 0
    fi
fi
case $1 in
    p|paste)
        paste "$@" ;;
    n|new)
        new "$@" ;;
    l|list)
        list ;;
    m|move)
        move "$@" ;;
    r|remove)
        remove "$@" ;;
    h|help)
        usage ;;
    *)
        copy "$@" ;;
esac
exit 0