Remove first element from $@ in bash
Use shift
.
Read $1
for the first argument before the loop (or $0
if what you're wanting to check is the script name), then use shift
, then loop over the remaining $@
.
q=${@:0:1};[ ${2} ] && set ${@:2} || set ""; echo $q
EDIT
> q=${@:1}
# gives the first element of the special parameter array ${@}; but ${@} is unusual in that it contains (? file name or something ) and you must use an offset of 1;
> [ ${2} ]
# checks that ${2} exists ; again ${@} offset by 1
> &&
# are elements left in ${@}
> set ${@:2}
# sets parameter value to ${@} offset by 1
> ||
#or are not elements left in ${@}
> set "";
# sets parameter value to nothing
> echo $q
# contains the popped element
An Example of pop with regular array
LIST=( one two three )
ELEMENT=( ${LIST[@]:0:1} );LIST=( "${LIST[@]:1}" )
echo $ELEMENT
Another variation uses array slicing:
for item in "${@:2}"
do
process "$item"
done
This might be useful if, for some reason, you wanted to leave the arguments in place since shift
is destructive.
firstitem=$1
shift;
for item in "$@" ; do
#process item
done