IT story

bash에서 $ @에서 첫 번째 요소 제거

hot-time 2020. 7. 18. 10:01
반응형

bash에서 $ @에서 첫 번째 요소 제거


이 질문에는 이미 답변이 있습니다.

스크립트에 전달 된 인수를 반복 해야하는 bash 스크립트를 작성 중입니다. 그러나 첫 번째 인수를 반복해서는 안되며 대신 루프 전에 확인해야합니다.

첫 번째 요소를 제거하지 않아도되면 다음을 수행 할 수 있습니다.

for item in "$@" ; do
  #process item
done

루프를 수정하여 첫 번째 반복인지 확인하고 동작을 변경할 수는 있지만 너무 해킹 된 것처럼 보입니다. 첫 번째 인수를 추출하고 나머지를 반복하는 간단한 방법이 있어야하지만 찾을 수 없었습니다.


사용 shift?

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_07.html

기본적으로 $1루프 앞의 첫 번째 인수를 거나 $0확인하려는 것이 스크립트 이름인지 확인한 다음을 사용 shift하고 나머지를 반복하십시오 $@.


또 다른 변형은 배열 슬라이싱을 사용합니다.

for item in "${@:2}"
do
    process "$item"
done

어떤 이유로 든 인수 shift가 파괴적 이므로 인수를 그대로 두려는 경우에 유용 할 수 있습니다 .


firstitem=$1
shift;
for item in "$@" ; do
  #process item
done

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

일반 배열이있는 팝의 예

   LIST=( one two three )
    ELEMENT=( ${LIST[@]:0:1} );LIST=( "${LIST[@]:1}" ) 
    echo $ELEMENT

참고 URL : https://stackoverflow.com/questions/2701400/remove-first-element-from-in-bash

반응형