for 루프에서 마지막 인수/매개변수 제외

for 루프에서 마지막 인수/매개변수 제외

마지막 인수를 제외한 모든 인수/인수를 반복하는 쉘 스크립트를 만들고 싶습니다. 이것이 내가 지금까지 가지고 있는 것입니다:

for i in $@
do
      echo "$i"
done

이는 ./script.sh 명령 이후의 모든 인수를 표시하는 데 효과적이지만 마지막 인수 또는 내가 선택한 인수를 무시할 수 있는 방법이 있었으면 좋겠습니다(예: 하나인 경우 항상 세 번째 인수 무시). . 분명히 말하면 지금은 마지막 인수/매개변수가 더 걱정됩니다.

저는 스크립팅이 처음이므로 이 답변이 포함된 다른 게시물이 있으면 사과드립니다. 나는 어떤 것에 새로운 것이 있다는 것은 일반적으로 당신이 찾고 있는 것을 적절하게 요청하는 방법을 모른다는 것을 의미한다는 것을 발견했습니다.

어떤 도움이라도 대단히 감사하겠습니다!

답변1

매개변수를 유지할 필요가 없는 경우

while (( $# > 1 ))
do
  echo "$1"
  shift
done

위치 매개변수를 변경하지 않고 유지하려면 개수를 유지하면 됩니다.

SKIP=$#

let x=1

for i
do
  if (( x != SKIP ))
  then
    echo "$i"
  fi
  let x=x+1
done

답변2

CentOS에는 Bash가 있을 수 있으므로 이를 사용할 수 있으면 배열의 일부를 실행할 수 있습니다.

for x in "${@:1:$# - 1}" ; do 
    echo do something with "$x"
done

${@:n:m}상징mnumber 에서 시작하는 위치 매개변수를 가져옵니다 n. 우리는 총 수를 취하고 $#마지막 매개 변수를 무시하기 위해 1을 뺍니다. 오프셋과 길이는 에서와 같이 산술 표현식으로 처리되므로 $((...))Stéphane이 아래에 설명했듯이 거기에서 산술을 수행할 수 있습니다. 배열 인덱싱은 일반적으로 0부터 시작하지만 $@0부터 시작하는 경우에는 $0in에서 쉘 이름이 도입되는데 이는 우리가 원하는 것이 아닙니다.

인수가 더 이상 분할되지 않도록 $@or 표현식을 인용할 가능성이 높습니다 .${@:n:m}

답변3

skip_last() {
   p=$1; shift

   for i
   do
      set ${1+"$@"} "$p"; p=$1; shift
   done

   for i
   do
      # do something with i when i != last now
      echo "$i"
   done
}
# and then...
skip_last "a" "b" "c" "d" "e"

답변4

당신은 그것을 사용할 수 있습니다for 루프변수를 , , ... i로 설정하고 사용하십시오.12n-1간접 확장$1, $2, ..., 로 변경합니다 $n-1.

for ((i=1; i<$#; i++)); do
    echo "${!i}"
done

관련 정보