答案1
如果您想同时使用 -r...,.. 和 -r... -r... -r... :创建一个脚本,例如“toto.bash”:
#!/usr/bin/bash
add_ranges () #this will add each integers or ranges (a-b) into the array: myarray
{
#first we test that we only have those validchars (makes the second step below much easier to write)
validchars='[1234567890,-]'
echo "$@" | grep "${validchars}" >/dev/null && {
: ; #only valid chars, probably ok. (but could be wrong, ex: 1- 2,, 4-3 etc...)
} || {
echo "The ranges you entered are not valid : they should only contain such characters: ${validchars}"
exit 1 ;
}
#secondly we now try to handle the current ranges lists (comma separated)
for range in $(echo "${@}" | tr ',' ' ')
do
if [[ ${range} =~ ^[0-9]+$ ]] # [[ can handle regexp matching, and doesn't need to quote parameters
then
myarray[${#myarray[*]}]=${range} #add this after the latest element in myarray
elif [[ ${range} =~ ^[0-9]+-[0-9]+$ ]]
then
newrange=$(echo "$range" | sed -e 's/-/../')
for i in `eval echo {$newrange}` # {a..b} means: all integers a to b
do
myarray[${#myarray[*]}]=${i} #add this after the latest element in myarray
done
else
echo "ERROR: I can not recognize this range: $range"
exit 1
fi
done
}
###### handle options using getopts:
OPTIND=1; #here for compatibility's sake: in case you add another function that uses getopts, reminds you to re-set OPTIND each time.
while getopts "r:" zeoption; do
case $zeoption in
r)
allranges="${OPTARG}";
add_ranges "${OPTARG}";
;;
-)
echo "option --, OPTARG=$OPTARG";
break ;
;;
*)
echo "ERROR: Unrecognized option: zeoption=$zeoption OPTARG=$OPTARG";
shift
;;
esac;
done;
shift $((OPTIND-1)) ; #we shift away all the options we processed.
###### end of options handling
# and we continue here...
echo "we now have : remaining arguments: ${@}"
echo "and myarray contains: ${myarray[@]}"
然后运行它:
$ ./toto.bash -r 2,4,6-12 -r 100-103 foo bar
we now have : remaining arguments: foo bar
and myarray contains: 2 4 6 7 8 9 10 11 12 100 101 102 103
我本来想给出一些提示,但发现写出来更好。这个答案很长,但我希望它能有所帮助!