[email protected] bash - программирование" />

Удалите первый элемент из [email protected] bash

Я пишу 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