help with a bash script problem

hi to everyone :slight_smile:

i am new to linux and bash and i am trying to build a bash script, that is quite similar to the well known cmd 'split' ... :wink:
it is now already "working" ... i can use it like:
./splitfix.sh -v -s 10 foo
./splitfix.sh -s 10 -v foo
./splitfix.sh -s 10 foo
./splitfix.sh -v foo

when i try wrong params i dont get an error (or the shorthelp) function and i dont know how to implement the --verbose tag in my code :frowning:

this is the third version of my script and i cant find a possibility to check the parameters.
i always have the problem, that if one parameter is -s that than has to follow a number (size in bytes or lines).

can anybody help me out? :frowning:

#!/bin/bash
#simple Tool to split files and txt files
#02.04.2011


###########################################
function usage () {

cat << EOF
       $0 [OPTIONS] FILE [FILE ...] Split FILE into
       fixed-size pieces.
       The pieces are 10 lines long,
          if FILE is a text file.
       The pieces are 10 kiB long, 
          if FILE is *not* a text file.
       The last piece may be smaller, it contains the rest
          of the original file.
       The output files bear the name of the input file
          with a 4-digit numerical suffix.
       The original file can be reconstructed with
          the command   ``cat FILE.*´´
       
    EXAMPLE:
       splitfix.sh foo.pdf
         splits foo.pdf into the files
         foo.pdf.0000 foo.pdf.0001 etc.
         
    splitfix.sh [-h | --help] This help text
    splitfix.sh --version     Print version number
    
    OPTIONS:
    -h
      --help    this help text
    -s SIZE     size of the pieces
                  in lines (for text files)
                  or in bytes (for other files)
        -v
           --verbose print debugging messages
          
EOF

}


###########################################
function shorthelp () {

    cat << EOF
    Usage: splitfix.sh [OPTIONS] FILE [FILE ...]
    »splitfix-sh --help« for more information.
EOF

}


###########################################
function check_param () {

if [[ $1 == '-s' ]]
then
    printf "%d" $2 > /dev/null 2>&1
    if [[ $? == 1 ]]
    then
        shorthelp
        exit 1
    else
        SIZE=$2
    fi

    if [[ $3 == '-v' ]]
    then
        shift 3
        verbose=on
        splitting $SIZE $verbose $*
    else 
        shift 2
        echo "debug2"
        splitting $SIZE $*
    fi
else
    if [[ $1 == '-v' ]]
    then
        shift 1
        verbose=on
        if [[ $1 == '-s' ]]
        then
            printf "%d" $2 > /dev/null 2>&1
            if [[ $? == 1 ]]
            then
                shorthelp
                exit 1
            else
                SIZE=$2
                shift 2
                splitting $SIZE $verbose $*
            fi
        else
            splitting $verbose $*
        fi
    fi
fi

}

################################################
function splitting () {

    if [[ $SIZE != "" ]]
    then
        shift 1
    fi

    if [[ $verbose == "on"  ]]
    then
        shift 1
    fi

    for i in $*
    do
        # Existiert die Datei?
        if [[ -e $i ]]
        then
            file --mime-type $i | grep -iq text
            if [ $? -eq 0 ]
            then
                if [[ $SIZE -gt 0 ]]
                then
                    if [[ $verbose = "on" ]]
                    then
                        echo "Die Textdatei wird gesplited"
                    fi
                    split --suffix-length=4 -d --lines=$SIZE $i $i.
                else
                    if [[ $verbose = "on" ]]
                    then
                        echo "Die Textdatei wird gesplited"
                    fi
                    split --suffix-length=4 -d --lines=10 $i $i.
                fi
            else
                if [[ $SIZE -gt 0 ]]
                then
                    if [[ $verbose = "on" ]]
                    then
                        echo "Die Binärdatei wird gesplited"
                    fi
                    split --suffix-length=4 -d --bytes=$SIZE $i $i.
                else
                    if [[ $verbose = "on" ]]
                    then
                        echo "Die Binärdatei wird gesplited"
                    fi
                    split --suffix-length=4 -d --bytes=10000 $i $i.
                fi

            fi
        else
            echo "File $i does not exist."
            exit 1
        fi
    done
}


###########################################
# main()
case "$1" in
    '--help' | '-h')
        usage
    ;;
    *)
        # Mindestens ein Argument..
        if [ $# -gt 0 ]
        then
            check_param $*
            exit 0
        else
            shorthelp
            exit 1
        fi
esac


try reading this article on getopts:
Bash: parsing arguments with �getopts� rsalveti�s random thoughts

hehe nice hint, thx :slight_smile:
saved a lot of my code :smiley:

but one question i cant figure out yet ... how can i parse --verbose or --help with getopts??
i appended a sample code, how can i now build in --help and --verbose in getopts?! :slight_smile:

#!/bin/bash
function usage(){
cat << EOF
    $0 [OPTIONS] usage
EOF
}

function shorthelp() {
    cat << EOF
    Usage: spltifix.sh [OPTIONS] FILE [FILE ...]
    splitfix.sh --help for more information
EOF

}

counter="0"
while getopts "hs:v" options; do
    case $options in
        h ) usage
            exit 0
            ;;
        s ) size=$OPTARG
            ((counter+=2))
            ;;
        v ) verbose='on'
            ((counter+=1))
            ;;
        \? ) shorthelp
             exit 1;;
    esac
done
echo $verbose
echo $counter
echo $size
shift $counter
echo $1
echo $2

That's unfortunately quite simple to answer: You can't. You could perhaps just do [ "$1" == "--help" ] && stuff before you even run getopts, but things like --verbose that you'd expect to put in the middle of getopts' options? getopts would throw up on it.

hmm that suxx :frowning:
what can i do if i want to offer those options?
-v
-s SIZE
-h
--help
-v
--verbose
a for loop that checks for --verbose and --help and sets flag or prints help?!
and then launch getops? i think that will give an error, because the --verbose or --help is still in the arguments list?

any idea? :frowning:

---------- Post updated at 05:27 PM ---------- Previous update was at 05:13 PM ----------

is there maybe a similar tool like getopts that can handle these types of parameters?
or does anybody have an idea, how i can build that script ...?

---------- Post updated 04-15-11 at 11:07 AM ---------- Previous update was 04-14-11 at 05:27 PM ----------

ok i now have it working :slight_smile:
maybe some1 has an idea, how i can grab not existing parameters.
i thought i could use the if not exists clause and in the else tree i call shorthelp.

#!/bin/bash
#Just a little Script to split other files
#AE
#MS
#
#BS Praktikum SS 2011


###########################
# Print long help version #
###########################
function usage() {

cat << EOF

    $0 [OPTIONS] FILE [FILE ...] Split FILE into
        fixed-size pieces.
        The pieces are 10 lines long,
            if FILE is a text file.
        The pieces are 10 kiB long,
                if FILE is *not* a text file.
        The last piece may be smaller, it contains the rest
            of the original file.
        The output files bear the name of the input file
            with a 4-digit numerical suffix.
        The original file can be reconstructed with
            the command    ��cat FILE.*''
    EXAMPLE:
        splitfix.sh foo.pdf
              splits foo.pdf into the files
             foo.pdf.0000 foo.pdf.0001 etc.
             
    splitfix.sh [-h | --help] This help text
    splitfix.sh --version   Print version number
    OPTIONS:
    -h
      --help    this help text
      -s SIZE     size of the pieces
                  in lines (for text files)
                   or in bytes (for other files)
    -v
      --verbose print debugging messages
EOF
}
############################
# print help short version #
############################
function shorthelp() {
cat << EOF
    Usage: splitfix.sh [OPTIONS] FILE [FILE ...]
    »splitfix-sh --help« for more information.            .
EOF
}

###############
# Versioninfo #
###############
function version() {
    echo "splitfix.sh ver0.8b"
}

########
# Main #
########

sizeFlag=0
size=10

function getSize() {
sizeFlag=1
}

if [[ $# -eq 0  ]]
then shorthelp
fi

#for (( i=1; $i <= $#; i++ ))
for i in $*
do
echo "i: $i"
echo "param count: $#"
echo "loop: $i"
echo "sizeFlag: $sizeFlag"

    if [[ sizeFlag -eq 1  ]]
    then 
        size=$1
        sizeFlag=0
        echo "size set"
    else
        case $1 in
            '-h' | '--help')
                usage
                exit 0;;
            '-s')
                echo "-s set"
                getSize;;
            '-v' | '--verbose')
                verbose=on;;
            '--version')
                version
                exit 0;;
            *)
            echo "no more params, file?"
            
            
            if [[ -e $1  ]]
            then
                file --mime-type $1 | grep -iq text
                if [[ $? -eq 0 ]]
                then
                    if [[ $verbose == "on"  ]]
                    then
                        echo "File $1 is a textdocument"    
                        echo "Now splitting the file ..."
                        split --verbose --suffix-length=4 -d --lines=$size $1 $1.
                    else
                        split --suffix-length=4 -d --lines=$size $1 $1.
                    fi
                else
                    if [[ $verbose == "on"  ]]    
                    then
                        echo "File is a binary/other document"
                        echo "Now splitting the file ..."
                        split --verbose --suffix-length=4 -d --bytes=$size"k" $1 $1.
                    else
                        split --suffix-length=4 -d --bytes=$size"k" $1 $1.
                    fi
                fi
            else
                echo "File $1 does not exist."
                exit 1
            fi
        esac    
    fi
    shift 1
    echo "shifting"
done
exit 0        
    
            


One last question ...

I cant figure out the main difference between:
if [[ expression ]]; then
if [ expression ]; then
if expression; then
if(expression); then

sometimes it works without the [[ braces, and if i put the expression in [[ it doesnt work any longer :frowning:

halp plox :slight_smile: