DrDeadbrain
DrDeadbrain

Reputation: 35

How to pass files as argument in Shellscript

so this is a question to a script that I already questioned about in a previous question : Link : Typesort Shellscript in Unix

So now below is my updated version of the Script and my new question is, how do I have to change it to pass multiple files as args to sort these?

And is there an easier option to accept arguments like "./typesort -rnv instead of -r -n -v" ? I feel like my solution is not optimal for this problem.

Thanks for your replies.

#!/bin/bash
#A shell script with in- and output


usage()
{
cat <<EOF
    $typesort [OPTIONS] 
        Sort filenames by file type given by 
        the ''file'' command
    $typesort --version Print version number
   OPTIONS:
   -t           sort text files only
   -n           sort non-text files only
   -r           reverse sort order
   -v --verbose print debugging messages
EOF
}
# ----------------------------------------------

#flags
tflag=0
nflag=0
rflag=0
vflag=0
bflag=0

# -------------------------------------------------
sort_nA() 
{
    if [ "$vflag" == 1 ]
        then
            echo "sort_nA"
            echo "file * | sort -t':' -k 2"
    fi
    file * | sort -t':' -k 2
}
# #######################################################

sort_r() 
{
    if [ "$vflag" == 1 ]
        then
            echo "sort_r"
            echo "file * | sort -t':' -k 2 -r"
    fi
    file * | sort -t':' -k 2 -r
}
# #######################################################

sort_t() 
{
    if [ "$vflag" == 1 ]
        then
            echo "sort_t"
            echo "file * | grep "ASCII text" | sort -t':' -k 2"
    fi
    file * | grep "ASCII text" | sort -t':' -k 2
}
# #######################################################


sort_n() 
{
    if [ "$vflag" == 1 ]
        then
            echo "sort_n"
            echo "file * | grep -v "ASCII text" | sort -t':' -k 2"
    fi
    file * | grep -v "ASCII text" | sort -t':' -k 2
}
# #######################################################

sort_rt() 
{
    if [ "$vflag" == 1 ]
        then
            echo "sort_rt"
            echo "file * | grep "ASCII text" | sort -t':' -k 2 -r"
    fi
    file * | grep "ASCII text" | sort -t':' -k 2 -r
}
# #######################################################

sort_rn() 
{
    if [ "$vflag" == 1 ]
        then
            echo "sort_rn"
            echo "file * | grep -v "ASCII text" | sort -t':' -k 2 -r"
    fi
    file * | grep -v "ASCII text" | sort -t':' -k 2 -r
}
# #######################################################

# main

while true 
    do
        if [ "$1" == "-t" ]
            then
                tflag=1
        elif [ "$1" == "-n" ]
            then
                nflag=1
        elif [ "$1" == "-r" ]
            then 
                rflag=1
        elif [ "$1" == "-v" ]
            then
                vflag=1
        else
            #at least 1 arg, let's check it
            case $1 in 
                "-h" | "--help") #display help text
                bflag=1
                usage
                break
                ;;
                "--version") #display version number
                echo "version number 0.1"
                bflag=1
                break
                ;;
                "") 
                break
                ;;
                "-rt" | "-tr")
                rflag=1
                tflag=1
                ;;
                "-rn" | "-nr")
                rflag=1
                tflag=1
                ;;
                "-rv" | "-vr")
                rflag=1
                vflag=1
                ;;
                "-vt" | "-tv")
                tflag=1
                vflag=1
                ;;
                "-vn" | "-nv")
                nflag=1
                vflag=1
                ;;
                "-tn" | "-nt")
                tflag=1
                nflag=1
                "-rtn" | "-trn" | "-tnr" | "-rnt" | "-nrt" | "-ntr")
                rflag=1
                tflag=1
                nflag=1
                ;;
                "-vtn" | "-tvn" | "-tnv" | "-vnt" | "-nvt" | "-ntv")
                vflag=1
                tflag=1
                nflag=1
                ;;
                "-rvn" | "-vrn" | "-vnr" | "-rnv" | "-nrv" | "-nvr")
                vflag=1
                rflag=1
                nflag=1
                ;;
                "-rvt" | "-vrt" | "vtr"  | "-rtv" | "-trv" | "-tvr")
                vflag=1
                rflag=1
                tflag=1
                ;;
                "-rvtn" | "-rtvn" | "-rtnv" | "-rvnt" | "-rnvt" | "-rntv" | "-vrtn" | "-vtrn" | "-vtnr" | "-vrnt" | "-vnrt" | "-vntr" | "-trvn" | "-tvrn" | "-tvnr" | "-trnv" | "-tnrv" | "-tnvr" | "-nrtv" | "-ntrv" | "-ntvr" | "-nrvt" | "-nvrt" | "-nvtr")
                vflag=1
                rflag=1
                tflag=1
                nflag=1
                ;;
                *) #anything else not valid
                echo "Invalid option: §1"
                ;;
            esac
        fi
        shift
    done
if [ "$vflag" == 1 ]
    then
        echo "tflag = $tflag"
        echo "nflag = $nflag"
        echo "rflag = $rflag"
        echo "bflag = $bflag"
fi
if [ "$bflag" == 1 ]
    then
        bflag=1 # nothing should happen
elif [ "$rflag" == 1 ] && [ "$tflag" == "$nflag" ]
    then 
        sort_r
elif [ "$rflag" == 1 ] && [ "$tflag" == 1 ]
    then
        sort_rt
elif [ "$rflag" == 1 ] && [ "$nflag" == 1 ]
    then
        sort_rn
elif [ "$tflag" == "$nflag" ]
    then
        sort_nA
elif [ "$tflag" == 1 ]
    then
        sort_t
elif [ "$nflag" == 1 ]
    then
        sort_n
fi
exit 0

Upvotes: 1

Views: 67

Answers (2)

user1934428
user1934428

Reputation: 22225

Just wrap the body of your script between

for arg in "$@"
do
  ..... # your script body goes here
done

and use $arg instead of $1. You can then pass several arguments, either explicitly, and/or using filename genaration:

your_script.sh file1 file2 other_files* file3

Upvotes: 1

Rebai Ahmed
Rebai Ahmed

Reputation: 1600

While your execution your script shell

 ./Yourshellscript.sh file1 file2 ..

Upvotes: 0

Related Questions