Я пишу bash script, который должен перебирать аргументы, переданные в script. Тем не менее, первый аргумент не должен быть зациклен, а вместо этого должен быть проверен перед циклом.
Если бы мне не пришлось удалять тот первый элемент, который я мог бы просто сделать:
for item in "[email protected]" ; do
#process item
done
Я мог бы изменить цикл, чтобы проверить, если он на первой итерации и изменить поведение, но это кажется слишком хакивым. Там должен быть простой способ извлечь первый аргумент, а затем перебрать все остальное, но я не смог его найти.
Ответы
Ответ 1
Использовать shift
?
http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_07.html
В принципе, прочитайте $1
для первого аргумента перед циклом (или $0
, если то, что вы хотите проверить, - это имя script), затем используйте shift
, затем переверните остальные [email protected]
.
Ответ 2
В другом варианте используется срез массива:
for item in "${@:2}"
do
process "$item"
done
Это может быть полезно, если по какой-то причине вы хотели оставить аргументы, поскольку shift
является разрушительным.
Ответ 3
firstitem=$1
shift;
for item in "[email protected]" ; do
#process item
done
Ответ 4
q=${@:0:1};[ ${2} ] && set ${@:2} || set ""; echo $q
ИЗМЕНИТЬ
> 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
Пример pop с регулярным массивом
LIST=( one two three )
ELEMENT=( ${LIST[@]:0:1} );LIST=( "${LIST[@]:1}" )
echo $ELEMENT