쉘 인수를 역순으로 인쇄

쉘 인수를 역순으로 인쇄

나는 조금 붙어 있습니다. 내 임무는 세 번째와 네 번째를 제외하고 스크립트의 인수를 역순으로 인쇄하는 것입니다.

내가 가진 것은 다음 코드입니다.

#!/bin/bash

i=$#
for arg in "$@"
do
    case $i
    in
        3) ;;
        4) ;;
        *) eval echo "$i. Parameter: \$$i";;
    esac
    i=`expr $i - 1`
done

나는 eval(PHP에 대한 모자 팁)을 싫어하기 때문에 그것이 없는 솔루션을 찾고 있지만 찾을 수 없습니다.

매개변수의 위치를 ​​동적으로 정의하는 방법은 무엇입니까?

추신: 아니요, 이것은 과제가 아닙니다. 저는 시험을 위해 쉘을 배우고 있어서 오래된 시험을 해결하려고 합니다.

답변1

eval동적으로 선택된 위치를 통해 위치 매개변수에 액세스하는 유일한 이식 가능한 방법입니다. (사용하지 않는) 값 대신 인덱스를 명시적으로 반복하면 스크립트가 더 깔끔해집니다. expr스크립트를 골동품 Bourne 쉘에서 실행하려는 경우가 아니면 연산 $((…))은 POSIX에 있습니다. 사용을 eval가능한 한 가장 작은 조각으로 제한하십시오. 예를 들어 사용하지 말고 eval echo임시 변수에 값을 할당하십시오.

i=$#
while [ "$i" -gt 0 ]; do
  if [ "$i" -ne 3 ] && [ "$i" -ne 2 ]; then
    eval "value=\${$i}"
    echo "Parameter $i is $value"
  fi
  i=$((i-1))
done

Bash에서는 를 사용하여 ${!i}이름이 지정된 매개변수의 값을 나타낼 수 있습니다 $i. 이 방법 $i은 명명된 인수 또는 숫자(위치 인수를 나타냄)일 때 작동합니다. 사용하시면 다른 bash 편의 기능도 활용하실 수 있습니다.

for ((i=$#; i>0; i--)); do
  if ((i != 3 && i != 4)); then
    echo "Parameter $i is ${!i}"
  fi
done

답변2

reverse나는 다음과 같은 작업을 수행하는 스크립트를 경로에 유지합니다.

#!/bin/sh

if [ "$#" -gt 0 ]; then
    arg=$1
    shift
    reverse "$@"
    printf '%s\n' "$arg"
fi

사용 예:

$ reverse a b c '*' '-n'
-n
*
c
b
a

전용 스크립트 대신 기능을 사용할 수도 있습니다.

답변3

위치 매개변수에 개행 문자가 포함되어 있지 않다고 가정합니다.

[ "$#" -gt 0 ] && printf '%s\n' "$@" | #print in order
sed '3,4 d' |                          #skip 3 and 4
tac                                    #reverse (try tail -r on
                                       #non-GNU systems).

시험:

set 1 2 3 4 5 6
printf '%s\n' "$@" | 
sed '3,4 d' |
tac

테스트 출력:

6
5
2
1

답변4

그리고 zsh:

$ set a 'foo bar' c '' '*'
$ printf '<%s>\n' "${(Oa)@}"
<*>
<>
<c>
<foo bar>
<a>

Oa확장 시 배열 요소를 정렬하는 데 사용되는 매개변수 확장 플래그입니다.취소배열 인덱스.

3과 4 제외:

$ printf '<%s>\n' "${(Oa)@[5,-1]}" "${(Oa)@[1,2]}"
<*>
<foo bar>
<a>

관련 정보