Skip to content

Instantly share code, notes, and snippets.

@thinkerbot
Created August 19, 2012 20:30
Show Gist options
  • Save thinkerbot/3397505 to your computer and use it in GitHub Desktop.
Save thinkerbot/3397505 to your computer and use it in GitHub Desktop.
Command line option handling strategies

= Argument handling strategies

# generate 1k,10k worth of arg data
ruby -e '200.times  {|i| puts("%.5d" % i) }' > 1k.txt
ruby -e '2000.times {|i| puts("%.5d" % i) }' > 10k.txt

# check size, bytes should be 1k
cat 1k.txt | tr -d "\n" | wc

# baseline
time tr "\n" " " < 1k.txt                             # 0.005
ps -l | grep -- $0 | grep -v grep | awk '{print $9}'  # 0.015 ~

# strategies
time ./echo_args    $(tr "\n" " " < 1k.txt) # 0.028, 828
time ./shift_args   $(tr "\n" " " < 1k.txt) # 0.030, 804
time ./set_args     $(tr "\n" " " < 1k.txt) # 0.120, 828
time ./append_args  $(tr "\n" " " < 1k.txt) # 0.274, 848
time ./parse_args   $(tr "\n" " " < 1k.txt) # 0.046, 864
time ./reorder_args $(tr "\n" " " < 1k.txt) # 0.066, 864
#!/bin/bash
set -- "$@" --
while [[ $1 != '--' ]]
do
set -- "$@" "$1"
shift
done
echo $@
ps -l | grep -- $0 | grep -v grep | awk '{print $9}'
#!/bin/bash
echo "$@"
ps -l | grep -- $0 | grep -v grep | awk '{print $9}'
#!/bin/bash
optparse () {
n=1
while [[ $n -lt $# ]]
do
n=$(($n + 1))
printf " \${%d}" $n
done
}
eval set -- $(optparse "$@")
echo $@
ps -l | grep -- $0 | grep -v grep | awk '{print $9}'
#!/bin/bash
eval set -- $(
vals=""
while [ $OPTIND -le $# ]
do
if getopts "achmrst:v" ts_option
then
if [ $OPTARG ]
then printf " -%s \${%d}" $ts_option $(($OPTIND - 1))
else printf " -%s" $ts_option
fi
else
vals="$vals \${$OPTIND}"
OPTIND=$(($OPTIND + 1))
fi
done
printf "%s" "$vals"
)
echo $@
ps -l | grep -- $0 | grep -v grep | awk '{print $9}'
#!/bin/bash
while [[ $# -gt 0 ]]
do
set $@
shift 1
done
echo $@
ps -l | grep -- $0 | grep -v grep | awk '{print $9}'
#!/bin/bash
while [[ $# -gt 0 ]]
do shift 1
done
echo $@
ps -l | grep -- $0 | grep -v grep | awk '{print $9}'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment