Reputation: 35
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
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
Reputation: 1600
While your execution your script shell
./Yourshellscript.sh file1 file2 ..
Upvotes: 0